2014-02-13 45 views
0

我已经建立了UDP接收器,如:未交付的UDP数据包 - recvfrom的()永远不会返回

int rx_socket; 
    struct sockaddr_in my_addr; 
    struct sockaddr_in rem_addr; 
    socklen_t addrlen = sizeof(rem_addr); 

    rx_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

    my_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    my_addr.sin_family = AF_INET; 
    my_addr.sin_port = htons(9900); 

    rc = bind(rx_socket, (struct sockaddr *) &(my_addr), sizeof(my_addr)); 
    if (!rc) { 
     printf("BIND SUCCESSFULL\n"); 
    } 

    char buf[250]; 

    while(1) { 
     printf("WAITING\n"); 
     recvfrom(rx_socket, buf, sizeof(buf), 0, (struct sockaddr *)&rem_addr, &addrlen); 
     printf("RECEIVED\n"); 
    } 

的recvfrom的()永远不会返回。我也做了一些Wireshark的分析,这表明数据包是否有:

摘要:

用户数据报协议,源端口:57506(57506),目的端口:IUA(9900)

校验: 0x14a2 [验证禁用]

数据(8个字节)


任何帮助将不胜感激。

编辑:

一个有趣的观察是,源,这是一个DSP未能发送的数据包,即,SENDTO()返回-1,直到我平到它,从目的地。在ping之后,源可以开始发送数据包。

编辑2:

这里是发送者的代码:

int fd; 
    fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

    struct sockaddr_in my_addr; 

    my_addr.sin_family = AF_INET; 
    my_addr.sin_port = htons(9900); 
    inet_aton("10.0.201.102", &(my_addr.sin_addr)); 

    char buf[250]; 

    for (;;) { 
     int bytesSent = sendto(fd, buf, 8, 0, 
       (struct sockaddr *) &(my_addr), sizeof(my_addr)); 
     printf("sent: %d bytes\n", bytesSent); 
     sleep(1000); 
    } 
+0

尽管程序的输出是什么? – alk

+0

第一次打印到控制台:“WAITING” – Iceman

+0

OT:这个'if(!rc)'是错的! 'bind()'在错误时返回'-1',所以它应该是'if(-1!= rc)'。 '0'是一个很少使用的,但是有效的套接字描述符。 – alk

回答

0

所以,问题竟然是在VirtualBox中。我的发件人在主机上,但接收者在虚拟机上。如果我在主机上运行接收器,则正在接收UDP数据包。

相关问题