c - ad hoc 网络中的 UDP 套接字 (Ubuntu 9.10)

标签 c linux networking ubuntu-9.10 sockets

我在 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));

注意不是所有的代码,只是有一个idea。

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

提前致谢!

最佳答案

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

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

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

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

关于c - ad hoc 网络中的 UDP 套接字 (Ubuntu 9.10),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2950075/

相关文章:

父进程退出后,子进程无法从终端读取

linux - 如何使用终端更改网络信息的 IP 地址?

c - 在将 sqlite3 包含到我的项目中时遇到问题,makefile 没有执行我想要的操作

java - 从 C 发送信号到 Java

c - mainCRTStartup 的签名是什么

iOS 编程蜂窝数据控制

linux - 重新编辑 netif_Rx 函数并启动相应的模块

c - -gc-sections 丢弃使用过的数据

linux - Python3 在 Linux 中从文件中读取参数

python - Visual Basic 开发人员想要编写 Linux 应用程序