Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 简单的UDP套接字代码,发送和接收消息_C++_C_Sockets_Udp - Fatal编程技术网

C++ 简单的UDP套接字代码,发送和接收消息

C++ 简单的UDP套接字代码,发送和接收消息,c++,c,sockets,udp,C++,C,Sockets,Udp,我正在学习UDP套接字,这是我第一个涉及它的代码。我有两个程序来回发送和接收消息。我的问题是,在代码更改时,我似乎必须多次声明我发送/接收的IP地址,但我觉得有一种更好的方法可以做到这一点,而无需在代码中手动更改inet_addr。从我的阅读来看,sendto和recvfrom可能会有所帮助,但我不确定在这种情况下如何使用它们。如果有人能告诉我如何解决我的简单问题,我将不胜感激!谢谢 代码1:发送然后接收 int main(int argc, char *argv[]) { //initiali

我正在学习UDP套接字,这是我第一个涉及它的代码。我有两个程序来回发送和接收消息。我的问题是,在代码更改时,我似乎必须多次声明我发送/接收的IP地址,但我觉得有一种更好的方法可以做到这一点,而无需在代码中手动更改inet_addr。从我的阅读来看,sendto和recvfrom可能会有所帮助,但我不确定在这种情况下如何使用它们。如果有人能告诉我如何解决我的简单问题,我将不胜感激!谢谢

代码1:发送然后接收

int main(int argc, char *argv[])
{
//initialize socket and structure
int socket_info;
struct sockaddr_in server;
char message[100];
char incoming_message[100];

printf("Input Message: ");
fgets(message, 100, stdin);

    //create socket
    socket_info = socket(AF_INET, SOCK_DGRAM, 0);
    if (socket_info == -1) {
    printf("Could not create socket");
    }

//assign local values
    server.sin_addr.s_addr = inet_addr("172.21.8.178");
    server.sin_family = AF_INET;
    server.sin_port = htons( 1100 );

    //binds connection
    if (bind(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {    
perror("Connection error");
       return 1;
    }
    puts("Bind");

    //assign new value to connect to
    server.sin_addr.s_addr = inet_addr("172.21.8.179");

    //checks connection 
    if (connect(socket_info, (struct sockaddr *)&server, sizeof(server)) <       0) {
    perror("Connection error");
       return 1;
    }
    puts("Connected");

    //sends message
if(send(socket_info, message, strlen(message), 0) <0) {        
perror("Send failed");
    return 1;
    }
    puts("Message Sent");

//receives message back    
if(recv(socket_info, incoming_message, sizeof(incoming_message), 0) <0) {    
puts("Received failed");
    return 1;
    }
    puts("Message received");
    puts(incoming_message);

close(socket_info);

}
intmain(intargc,char*argv[])
{
//初始化套接字和结构
int socket_信息;
服务器中的结构sockaddr_;
字符消息[100];
字符传入_消息[100];
printf(“输入消息:”);
fgets(信息,100,标准输入);
//创建套接字
socket_info=socket(AF_INET,SOCK_DGRAM,0);
如果(套接字信息==-1){
printf(“无法创建套接字”);
}
//分配局部值
server.sin_addr.s_addr=inet_addr(“172.21.8.178”);
server.sinu family=AF\u INET;
server.sin_port=htons(1100);
//绑定连接
if(bind(socket_info,(struct sockaddr*)&server,sizeof(server))<0{
perror(“连接错误”);
返回1;
}
出售(“绑定”);
//指定要连接到的新值
server.sin_addr.s_addr=inet_addr(“172.21.8.179”);
//检查连接
if(connect(socket_info,(struct sockaddr*)&server,sizeof(server))<0){
perror(“连接错误”);
返回1;
}
看跌期权(“关联”);
//发送消息

如果(使用函数recvfrom()发送(套接字信息,消息,strlen(消息),0)

此函数的作用是用刚接收到的数据包的IP和端口信息填充sockaddr的结构。例如,如果先发送后接收的代码向接收方发送数据包,则接收方应该能够用正确的值填充Sinu addr和Sinu port的结构值。然后,您可以使用此信息调用sendto(),以便将其发送到正确的计算机

以下是这些功能的手册页:

尝试使用以下方法:

inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)
127.0.0.1是环回IP。该地址用于建立到同一台机器的IP连接,这似乎是您的情况


可以找到解决此问题的详细方法

绑定未连接,在绑定错误上打印“连接错误”只会误导您自己。您可以使用sendto()而不是连接套接字。我认为连接API用于TCP套接字。它在这里的用途是什么?对于UDP套接字程序,您不需要使用连接。它不是正确的UDP代码。请查看simple echo server。它会帮助您。@NaveenKumar它不是必需的,但它是可能的,并且这样做不是不正确的编码。这看起来更像隐藏在sockdgram后面的TCP套接字
    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
             struct sockaddr *src_addr, socklen_t *addrlen);
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)