C语言 UDP 数据包未传递 - recvfrom() 从不返回



我已经设置了一个UDP接收器,如下所示:

   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 SUCCESSFULLn");
    }
    char buf[250];
    while(1) {
        printf("WAITINGn");
        recvfrom(rx_socket, buf, sizeof(buf), 0, (struct sockaddr *)&rem_addr, &addrlen);
        printf("RECEIVEDn");
    }

recvfrom() 永远不会返回。我已经做了一些Wireshark分析,它表明数据包在那里:

总结:

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

校验和:0x14a2 [验证已禁用]

数据(8 字节)


任何帮助将不胜感激。

编辑:

一个有趣的观察是,作为 DSP 的源无法发送数据包,即 sendto() 返回 -1,直到我从目的地 ping 到它。在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 bytesn", bytesSent);
        sleep(1000);
    }

所以问题出在虚拟盒子上。我的发送方位于主机上,但接收方位于虚拟机上。如果我也在主机上运行接收器,则会收到 UDP 数据包。

最新更新