Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UDP数据包未送达-recvfrom()永远不会返回_C_Sockets_Udp_Fedora - Fatal编程技术网

UDP数据包未送达-recvfrom()永远不会返回

UDP数据包未送达-recvfrom()永远不会返回,c,sockets,udp,fedora,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);

我已设置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);
    }

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

程序的输出是什么?第一次打印到控制台:“WAITING”OT:This
如果(!rc)
是错误的
bind()
在出错时返回
-1
,因此如果(-1!=rc),则应为
<代码>0
是一个很少使用但有效的套接字描述符。好的,wireshark显示端口正确-IP正确吗?您是否允许防火墙中的特定端口(fedora默认启用该端口)?或者尝试禁用防火墙,
/sbin/service iptables stop
wireshark中的一切正常吗?(它可以显示IP报头校验和和和UDP校验和是否有效-打开这些设置。并检查MAC地址是否匹配)