【问题标题】:UDP sockets in ad hoc network (Ubuntu 9.10)ad hoc网络中的UDP套接字(Ubuntu 9.10)
【发布时间】:2010-06-01 13:21:49
【问题描述】:

我在 Ubuntu 9.10 中使用 BSD 套接字通过以下代码以广播方式发送 UDP 数据包:

        sock_fd = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
        //sock_fd=socket(AF_INET,SOCK_DGRAM,0);
        receiver_addr.sin_family = PF_INET;
        //does not send with broadcast in ad hoc
        receiver_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
        inet_aton("169.254.255.255",&receiver_addr.sin_addr);
        receiver_addr.sin_port = htons(port);
        int broadcast = 1;
           // this call is what allows broadcast packets to be sent:
           if (setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, &broadcast,
               sizeof broadcast) == -1) {
               perror("setsockopt (SO_BROADCAST)");
               exit(1);
           }
        ret=sendto(sock_fd, packet, size, 0,(struct sockaddr*)&receiver_addr,sizeof(receiver_addr));

注意不是全部的代码,只是有一个想法。

如果我连接到基础设施无线网络,程序会使用 INADDR_BROADCAST 发送所有数据。但是,如果我的笔记本电脑连接到 ad-hoc 网络,它能够接收所有数据,但不能发送数据。我已经解决了使用169.254.255.255广播地址的问题,但是我想知道是怎么回事。

提前谢谢你!

【问题讨论】:

  • “不发送”表示函数返回错误,或者网络上的其他机器看不到数据包?
  • 尝试 tcpdump 或 wireshark 并告诉我们发生了什么事.. 你如何得出不能发送数据包的结论?
  • 它返回 -1... 抱歉回复晚了!

标签: c linux networking ubuntu-9.10 sockets


【解决方案1】:

您是否拥有多个适配器(即有线以太网、WLAN)?

当您发送到受限广播地址 (INADDR_BROADCAST) 时,您的 IP 堆栈使用第一个适配器并发送帧。您无法控制选择特定适配器。当 IP 堆栈发送到找到的第一个适配器时,它就完成了它的工作。如果路由器不阻止这种情况,该帧将在整个 Internet 上泛滥。这就是默认情况下 UDP 广播不可路由的原因。 (在 DHCP 中继中实现时存在例外。)

当您需要在特定网络上发送 UDP 帧时,您需要网络广播地址。当您在 AUTOIP 网络上发送到 169.254.255.255 时,您已经这样做了。

setsocket(SOL_SOCKET, SO_BROADCAST) 只是将套接字配置为允许发送广播。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多