2010-03-02 86 views
0

我必须通过UDP连接到远程服务器,并向其发送预定消息以获取消息。我第一次尝试在TCP中使用它,它发挥作用,但在UDP中发送消息并在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”。

+1

你确定服务器在两种协议上运行吗?你在控制服务器吗?如果是这样,你可以告诉消息是否首先到达服务器? – 2010-03-02 20:48:44

+0

不,我不控制服务器,但它支持UDP。端口号中唯一的常量。我有没有办法确保邮件正确发送? – sfactor 2010-03-02 20:53:09

+1

创建*连接* UDP套接字 - 如果操作系统接收到ICMP-Port-Unreachable,那么你会在接收时收到一个错误(但不是在发送时)。 – 2010-03-02 20:57:56

回答

1

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

总之,您的服务器可能只能监听TCP端口,而不是UDP。

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

+0

一切都应该工作,并且防火墙没有问题。只有当我发送给定端口号的确切消息时,我才能从服务器收到任何消息。有没有其他的东西可能会出现错误,如消息缓冲区或任何东西? – sfactor 2010-03-02 21:18:48

+0

是的,对于UDP来说,很多事情可能会出错 - 因为UDP本身没有保证 - 路由上的任何节点(包括源和目标)都可能丢弃数据报;服务器套接字接收缓冲区可能已满(再次,结果是丢弃的数据报)。但看起来你的问题很可能是错误的信息格式。服务器是否是一个嵌入式系统(像那些小型无线路由器)?那么它可能是不同的*排序*。你真的必须研究应用协议来找出那里有什么问题。 – 2010-03-02 21:29:15

0

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

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

+0

是的,我会检查使用wireshark,thanx的建议。关于你的问题,它基本上只是阻止。 – sfactor 2010-03-03 05:03:52