2013-09-22 43 views
0

我正在寫一個android應用程序,我需要與wifi網絡上的計算機進行通信。所有的代碼都是用java編寫的,wifi網絡是一個ad hoc網絡。爲了連接,我首先發送一個NBNS廣播名稱查詢,以查找我希望從手機連接到的機器。大多數情況下,按預期工作(5次中約3或4次)。有時候,名稱查詢失敗。在任何一種情況下,當我發出名稱查詢時,在我試圖連接到(使用wireshark)的計算機上看到名稱查詢數據包之後,我看到一個ARP查詢出去,看起來像...android設備忽略ARP查詢

HonHaiPr_69:a0:67廣播ARP 42誰有192.168.1.2?告訴192.168.1.10

這是我試圖連接的計算機上的卡,詢問誰有我的電話地址。如果成功,我的手機用盡職盡責的ARP響應回覆...

SamsungE_75:46:BB HonHaiPr_69:A0:67 ARP 192.168.1.2 42在98:0C:82:75:46:BB

一旦我的手機回答了ARP查詢,我就可以繼續與計算機通信。雖然這些ARP查詢似乎被我的電話忽略,但名稱查詢失敗。我從來沒有看到ARP響應,並且我推出的NBT查詢結束了。我已經嘗試了在標準java包中可用的每種形式的數據報/套接字初始化,沒有任何幫助。我已經研究過寫出自己的arp響應數據包,但是由於ARP所在棧的位置,我需要訪問原始套接字編程功能,這意味着我必須根據手機進行設置。這對我來說是一個不可接受的解決方案,因爲我希望普通的android用戶能夠使用這個應用程序,而不必對他們的手機或他們的wifi網絡做任何特殊的事情。如果你們之前遇到過這個問題並且解決了它,你能否讓我知道這個神奇的配方?預先感謝您提供的任何輸入。

+0

在我看來,這是您的Android網絡配置問題,而不是編程問題。考慮到你已經(可以理解)排除了設備的根源,這個問題不能在Java中解決。 –

+0

我擔心這也是我開始談論的結論。如果是這樣,這通常是Android的問題,因爲它發生在多個設備上。這也可能是路由器的一個問題,但我不知道爲什麼有時ARP數據包會將它傳送到手機,有時不會。 – JSantoro

回答

0

Android似乎完全忽略了ARP查詢。我的網絡中有3個android手機和一個chromecast設備。正如你可以看到下面的Android設備從不響應ARP查詢。

[email protected]:~# tcpdump -i wlan0 -v arp 
tcpdump: listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes 
13:17:00.378724 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has cheetah tell viper, length 28 
13:17:00.378747 ARP, Ethernet (len 6), IPv4 (len 4), Reply cheetah is-at xx:xx:xx:xx:xx:xx (oui Unknown), length 28 
13:17:14.969613 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has android-xxx tell viper, length 28 
13:17:32.562764 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has android-yyy tell viper, length 28 
13:17:32.606825 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has cheetah tell selvans-cc, length 28 
13:17:32.606850 ARP, Ethernet (len 6), IPv4 (len 4), Reply cheetah is-at xx:xx:xx:xx:xx:xx (oui Unknown), length 28 
13:17:45.433222 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has cheetah tell viper, length 28 
13:17:45.433243 ARP, Ethernet (len 6), IPv4 (len 4), Reply cheetah is-at xx:xx:xx:xx:xx:xx (oui Unknown), length 28 
13:18:06.065819 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has android-xxx tell viper, length 28 
13:18:17.669232 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has viper tell cheetah, length 28 
13:18:17.669716 ARP, Ethernet (len 6), IPv4 (len 4), Reply viper is-at xx:xx:xx:xx:xx:xx (oui Unknown), length 28 
13:18:20.631890 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has android-yyy tell viper, length 28 
13:18:51.639434 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has cheetah tell viper, length 28 
13:18:51.639455 ARP, Ethernet (len 6), IPv4 (len 4), Reply cheetah is-at xx:xx:xx:xx:xx:xx (oui Unknown), length 28 
13:19:02.213231 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has viper tell cheetah, length 28 
13:19:02.213762 ARP, Ethernet (len 6), IPv4 (len 4), Reply viper is-at xx:xx:xx:xx:xx:xx (oui Unknown), length 28 
+0

我知道這是一個相當老的帖子,但我只想指出,Android 4.4不會*在連接到網絡時忽略ARP查詢。但是,當手機屏幕關閉時,作爲省電措施,設備會完全斷開網絡連接直到需要,因此甚至不會收到ARP查詢。 – DividedByZero