2013-05-14 43 views
1

背景故事:
我有創造它自己的SSID,分配本身使用自動IP的IP地址,並開始廣播發現信息爲255.255.255.255的無線設備。 (不幸的是,它不容易支持多播)DatagramSocket的廣播行爲(Windows與Linux)的

我想要做的事:
我需要能夠接收發現信息,然後發送配置信息到該設備。問題是,使用auto-ip,「IP協商」過程在Windows上可能需要幾分鐘時間(在此期間,我可以看到廣播,甚至可以將廣播信息發送回設備)。

所以我枚舉所有連接的網絡接口(不能直接告訴其將被用於與設備對話),創造他們的每一個地址的一個DatagramSocket,然後開始聽。如果我通過一個特定的套接字接收到發現信息,我知道我可以使用相同的套接字將數據發送回設備。 這適用於Windows。

問題:
在Linux和OSX,下面的代碼不接收廣播數據包:

byte[] addr = {(byte)169, (byte)254, (byte)6, (byte)215}; 
DatagramSocket foo = new DatagramSocket(new InetSocketAddress(InetAddress.getByAddress(addr), PORT_NUM)); 
while (true) 
{ 
byte[] buf = new byte[256]; 
DatagramPacket pct = new DatagramPacket(buf, buf.length); 
foo.receive(pct); 
System.out.println(IoBuffer.wrap(buf).getHexDump()); 
} 

爲了接收廣播包(在Linux/OSX),我需要創建用我的DatagramSocket:
DatagramSocket foo = new DatagramSocket(PORT_NUM);

然而,當我再使用此接口將數據發送回設備,該數據包是由OS(我假設),並自個路由e感興趣的接口可能處於自動ip協商中,失敗。

思考以下?

  • 如何獲得 「工作」 的Windows行爲在Linux/OSX發生
  • 一個更好的辦法來處理這個過程

提前感謝!

+0

我不明白你的Linux機器的網絡接口,怎麼會「在自動IP協商中」,請問這臺機器得到它的IP地址?靜態還是DHCP?機器應該有獨立於無線設備的IP地址?或者通過auto-ip讓所有機器獲得IP地址?自動IP真的是http://en.wikipedia.org/wiki/Zero-configuration_networking? – HeatfanJohn

+0

@HeatfanJohn我相信自動IP(自動專用IP尋址(APIPA))和ZeroConf的是在同一個。在IP協商過程中,操作系統會隨機選擇IP地址並對其進行探測以確保不存在衝突。該過程可能需要幾分鐘的時間。在此期間,我仍然可以使用該接口發送和接收廣播_if_我正在使用先前綁定的套接字。但是,使用「通配符」DatagramSocket,操作系統不會將數據包路由到此設備。 – Arsinio

回答

0

我不認爲這是與代碼的問題。您是否檢查過OSX/Linux是否通過他們的防火牆正確地允許這些地址/端口號?我在過去也曾經有過這個簡單的問題= P ..

僅供參考,有一個很好的技術,那就是爲解決這個問題的內置零配置。這是非常容易學習,所以我建議你也看看。

祝你好運。

+0

我希望我可以使用ZeroConf!不幸的是,該設備不支持這種事情。我知道防火牆設置很好,因爲當我用通配符實例替換DatagramSocket實例時,我可以看到廣播。 – Arsinio