从服务器接收UDP消息的问题

时间:2010-03-02 20:44:26

标签: c network-programming udp client-server

我必须通过UDP连接到远程服务器并向其发送预定的消息以便收回消息。我首先在TCP中尝试了这个,但是在我发送消息并在recvfrom()中收听回复之后,它在UDP中工作,我什么都没得到。任何人都可以告诉我这里可能存在什么问题。

if ((bytes_sent = sendto(sockfd, UDP_MSG, strlen(UDP_MSG), 0, p->ai_addr, p->ai_addrlen)) == -1) {
            perror("ClientUDP: Error sending data");
            exit(1);
        }

printf("Data sent %s\n", UDP_MSG);  

len = sizeof(struct sockaddr_storage);

if ((bytes_recv = recvfrom(sockfd, bufudp, MAXDATASIZE-1, 0,(struct sockaddr*)&addr, &len)) == -1) {
            perror("Error receiving in UDP");
            exit(1);
        }



printf("Bytes recv %d\n", bytes_recv);  

bufudp[bytes_recv] = '\0';
printf("ClientUDP: Received\n %s \n",bufudp );   

使用scanf()从键盘输入端口,消息为字符串“HI”。

2 个答案:

答案 0 :(得分:1)

TCP和UDP不可互换。一些特定的协议使用两者(例如DNS),但是大部分都选择其中一个。 HTTP(S)建立在TCP之上,因为它需要双向流。许多音频/视频协议都建立在UDP之上,因为丢失/重新排序的数据包(偶尔)并不重要。

简而言之,您的服务器可能只侦听TCP端口,而不是UDP。

如果您知道该服务器正在侦听TCP和UDP,请检查两台计算机上和路由上的防火墙。

答案 1 :(得分:0)

如果您想查看UDP数据包是否正在使用正确的内容和地址离开您的计算机,我会安装Wireshark。此实用程序将捕获并解码计算机发送/接收的所有IP数据包。

有一个问题,recvfrom()会立即返回还是仅阻止?如果它立即返回,我会检查返回值是否为-1,如果是,则表示错误代码出现在errno中。