C 从服务器接收UDP消息时出现问题

C 从服务器接收UDP消息时出现问题,c,network-programming,udp,client-server,C,Network Programming,Udp,Client Server,我必须通过UDP连接到远程服务器,并向其发送预定的消息,以便返回消息。我第一次在TCP中尝试了这一点,但在UDP中,在我发送消息并在recvfrom()中侦听回复后,我什么也没有得到。谁能告诉我这里有什么问题吗 if ((bytes_sent = sendto(sockfd, UDP_MSG, strlen(UDP_MSG), 0, p->ai_addr, p->ai_addrlen)) == -1) { perror("ClientUDP: Error se

我必须通过UDP连接到远程服务器,并向其发送预定的消息,以便返回消息。我第一次在TCP中尝试了这一点,但在UDP中,在我发送消息并在recvfrom()中侦听回复后,我什么也没有得到。谁能告诉我这里有什么问题吗

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”。

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

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


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

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


有一个问题,recvfrom()是立即返回还是只是阻塞?如果它立即返回,我将检查返回值是否为-1,如果是,则表明errno中存在错误代码。

您确定服务器在两种协议上都运行吗?您是否控制服务器?如果是这样的话,你能告诉我消息是否在第一时间到达服务器吗?不,我不控制服务器,但它支持UDP。端口号中唯一的Constant。有没有办法确保消息在我的部分正确发送?创建已连接的UDP套接字-这样,如果操作系统接收到无法访问的ICMP端口,则在接收时(但不是在发送时)会出现错误。我尝试使用已连接的UDP,在recvfrom()中得到“接收UDP时出错:连接被拒绝”好吧,一切都应该正常工作,防火墙没有问题。问题是,只有当我在给定的端口号上发送确切的消息时,我才会从服务器收到任何消息。是否有任何其他可能出错的事情,如msg缓冲区或任何东西??是的,对于UDP,许多事情可能会出错-因为UDP本身没有保证-路由上的任何节点,包括源和目标,可能只是丢弃数据报;服务器套接字接收缓冲区可能已满(同样,结果是丢弃数据报)。但看起来您的问题很可能是信息格式错误。服务器是嵌入式系统(像那些小型无线路由器)吗?那么它可能具有不同的终结性。你真的需要研究应用程序协议来找出哪里出了问题。是的,我会使用wireshark,thanx来检查建议。关于你的问题,它基本上只是阻塞。