ad hocnetworking中的UDP套接字(Ubuntu 9.10)

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

请注意,并不是所有的代码,只是有一个想法。

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

先谢谢你!

你有多个适配器(即有线以太网,无线局域网)?

当您发送到有限广播地址(INADDR_BROADCAST)时,您的IP堆栈使用第一个适配器并发送帧。 您对选择特定的适配器没有任何控制权。 当IP堆栈发送到找到的第一个适配器时,它已经完成了它的工作。 如果路由器不能阻止这个帧,那么这个帧就会被整个互联网所淹没。 这就是为什么UDP广播默认无法路由的原因。 (在DHCP中继中实施例外情况)

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

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