2010-06-01 256 views
3

我正在使用Ubuntu 9.10的BSD套接字来发送UDP数据包广播用下面的代码:UDP套接字(Ubuntu的9.10)

 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广播地址解决了这个问题,但我想知道发生了什么。

预先感谢您!

+0

“不发送”意味着函数返回一个错误,或者网络上的其他机器看不到数据包? – 2010-06-01 13:25:51

+0

尝试使用tcpdump或wireshark并告诉我们发生了什么事情。 您如何断定您无法发送数据包? – Jack 2010-06-01 13:28:06

+0

它返回-1 ...对于迟到的答案抱歉! – Ekhiotz 2010-06-11 00:30:12

回答

2

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

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

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

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