java - Android 设备忽略 ARP 查询

标签 java android arp

我正在编写一个 Android 应用程序,我需要在 Wi-Fi 网络上与计算机进行通信。所有代码都是用java编写的,wifi网络是一个ad hoc网络。为了进行连接,我首先向我希望从手机连接的机器发送 NBNS 广播名称查询。大多数情况下,这会按预期工作(大约五分之三或四)。但有时,名称查询会失败。无论哪种情况,当我发送名称查询时,在我尝试连接的计算机上看到名称查询数据包(使用wireshark)后,我都会看到一个 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 42 192.168.1.2 位于 98:0c:82:75:46:bb

一旦我的手机回答了 ARP 查询,我就可以继续与计算机通信。但当我的手机似乎忽略了这些 ARP 查询时,名称查询就会失败。我从未看到 ARP 响应,并且我发出的 NBT 查询最终超时。我已经尝试了标准 java 包中可用的每种形式的数据报/套接字初始化,但没有任何帮助。我已经研究过编写自己的 arp 响应数据包,但由于 ARP 位于堆栈上的位置,我需要访问原始套接字编程功能,这意味着我必须 root 我的手机。这对我来说是一个 Not Acceptable 解决方案,因为我希望普通 Android 用户能够使用这个应用程序,而无需对他们的手机或 WiFi 网络做任何特殊的事情。如果你们中的任何人以前遇到过这个问题并解决了它,请让我知道神奇的公式吗?预先感谢您提供的任何意见。

最佳答案

Android 似乎完全忽略 ARP 查询。我的网络上有 3 部 Android 手机和一台 chromecast 设备以及其他设备。正如您在下面看到的,Android 设备永远不会响应 ARP 查询。

root@cheetah:~# 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

关于java - Android 设备忽略 ARP 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18939300/

相关文章:

java - 想要在日历的当天单元格中显示照片

linux - UDP套接字是否有可能接收ARP消息

Java ARP 扫描器

android - 如何正确关闭和重新打开房间数据库

android - 如何在 Android 中为单击的图像按钮制作边框?

java - 设置 JFrame 的背景颜色

java - 将 SQLite 条目打印到 ListView 中

c++ - LibNet 读取 ARP 响应?

java - 在jetty9上使用xml部署war文件

java - 如何让线程等待任务完成?