UDP数据包未传递 - recvfrom()永远不会返回

时间:2014-02-13 18:39:18

标签: c sockets udp fedora

我已经设置了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 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分析,它表明数据包在那里:

要点:

用户数据报协议,Src端口:57506(57506),Dst端口: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 bytes\n", bytesSent);
        sleep(1000);
    }

1 个答案:

答案 0 :(得分:0)

所以问题最终出现在virtualbox上。我的发件人在主机上,但接收器在虚拟机上。如果我也在主机上运行接收器,则正在接收UDP数据包。