【问题标题】:UDP packets not delivered - recvfrom() never returnsUDP 数据包未传递 - recvfrom() 永远不会返回
【发布时间】:2014-02-13 18:39:17
【问题描述】:

我已经设置了一个 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);
    }

【问题讨论】:

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

标签: c sockets udp fedora


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2011-07-25
    • 1970-01-01
    • 2012-10-02
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多