背景故事:
我有創造它自己的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發生
- 一個更好的辦法來處理這個過程
提前感謝!
我不明白你的Linux機器的網絡接口,怎麼會「在自動IP協商中」,請問這臺機器得到它的IP地址?靜態還是DHCP?機器應該有獨立於無線設備的IP地址?或者通過auto-ip讓所有機器獲得IP地址?自動IP真的是http://en.wikipedia.org/wiki/Zero-configuration_networking? – HeatfanJohn
@HeatfanJohn我相信自動IP(自動專用IP尋址(APIPA))和ZeroConf的是在同一個。在IP協商過程中,操作系統會隨機選擇IP地址並對其進行探測以確保不存在衝突。該過程可能需要幾分鐘的時間。在此期間,我仍然可以使用該接口發送和接收廣播_if_我正在使用先前綁定的套接字。但是,使用「通配符」DatagramSocket,操作系統不會將數據包路由到此設備。 – Arsinio