2010-06-01 462 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)只是將套接字配置爲允許發送廣播。