java 获取arp表,java – Android arp表 – 开发问题

我正在编写的Android应用程序有两个问题.

我正在从/ proc / net / arp中读出本地arp表,并在哈希映射中保存ip和相应的mac地址.看我的功能.它运作正常.

/**

* Extract and save ip and corresponding MAC address from arp table in HashMap

*/

public Map createArpMap() throws IOException {

checkMapARP.clear();

BufferedReader localBufferdReader = new BufferedReader(new FileReader(new File("/proc/net/arp")));

String line = "";

while ((line = localBufferdReader.readLine()) != null) {

String[] ipmac = line.split("[ ]+");

if (!ipmac[0].matches("IP")) {

String ip = ipmac[0];

String mac = ipmac[3];

if (!checkMapARP.containsKey(ip)) {

checkMapARP.put(ip, mac);

}

}

}

return Collections.unmodifiableMap(checkMapARP);

}

>第一个问题:

我也在使用广播接收器.当我的应用程序收到状态WifiManager.NETWORK_STATE_CHANGED_ACTION时,我检查是否建立了与网关的连接.如果为true,我调用我的函数来读取arp表.但是在这个阶段,系统还没有构建arp表.有时当我收到连接状态时,arp表是空的.

有人有想法解决这个问题吗?

>第二个问题:

我想以持久的方式保存网关的ip和mac地址.现在我正在使用Shared Preferences.也许写入内部存储更好?

有小费吗?

解决方法:

对于第一个问题,您可以在睡眠一段时间之后启动一个运行该方法的新线程,或者直到它有一些条目(使用邮箱创建Runnable以获取Map) – 除非您需要直接使用地图,那么我认为唯一的方法是等待参赛作品.例如(如果您需要直接使用地图):

public Map createArpMap() throws IOException {

checkMapARP.clear();

BufferedReader localBufferdReader = new BufferedReader(new FileReader(new File("/proc/net/arp")));

String line = "";

while ((line = localBufferdReader.readLine()) == null) {

localBufferdReader.close();

Thread.sleep(1000);

localBufferdReader = new BufferedReader(new FileReader(new File("/proc/net/arp")));

}

do {

String[] ipmac = line.split("[ ]+");

if (!ipmac[0].matches("IP")) {

String ip = ipmac[0];

String mac = ipmac[3];

if (!checkMapARP.containsKey(ip)) {

checkMapARP.put(ip, mac);

}

}

} while ((line = localBufferdReader.readLine()) != null);

return Collections.unmodifiableMap(checkMapARP);

}

标签:java,android

来源: https://codeday.me/bug/20190709/1412401.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java是一种非常强大的编程语言,可以用来编写各种类型的应用程序,包括网络应用程序。ARP(Address Resolution Protocol,地址解析协议)是用于在不同网络层之间解析IP地址和硬件MAC地址的协议。 要自定义ARP,我们可以使用Java的网络编程库来实现。以下是一种可能的实现方式: 首先,我们需要创建一个Java类来实现ARP协议。这个类应该有一个方法用于接收和处理来自其他主机的ARP请求和响应。在这个方法中,我们可以解析收到的ARP数据包,并根据需要进行相应的操作,比如更新ARP缓存或回复ARP请求。 接下来,我们需要使用Java的网络编程库来实现与网络接口的交互。我们可以使用Java的Socket类来创建一个网络套接字,并使用套接字进行网络通信。通过套接字,我们可以发送和接收ARP数据包。 在ARP处理方法中,我们还需要使用Java的数据包处理库来解析和构建ARP数据包。数据包处理库提供了一些方便的类和方法,可以帮助我们获取和设置数据包的各个字段,比如源IP地址,目标IP地址,源MAC地址和目标MAC地址。 最后,我们可以将自定义ARP程序集成到一个完整的Java应用程序中。我们可以使用Java的主类来初始化和管理ARP实例,并在需要时调用ARP处理方法。 总结起来,通过使用Java的网络编程库和数据包处理库,我们可以自定义实现ARP协议。这样,我们就能够解析和构建ARP数据包,并进行相应的处理操作。这个自定义ARP程序可以用于各种网络应用程序中,帮助实现更高级的网络功能。 ### 回答2: Java是一种面向对象的编程语言,可以通过自定义ARP(地址解析协议)实现网络层的地址解析操作。ARP是一种用于映射IP地址和物理硬件地址的协议,主要用于在局域网中进行地址解析。 要自定义ARP,在Java中可以使用Socket编程和PacketCapture技术。首先,需要创建一个Java程序,使用Socket编程来发送ARP请求和接收ARP响应。通过Socket的send和receive方法,可以通过数据包进行数据的发送和接收。 接下来,需要定义一个ARP报文的结构,包括源IP地址、目的IP地址、源硬件地址、目的硬件地址等字段。可以使用Java中的类和数据结构来定义这些字段,比如使用InetAddress类来示IP地址,使用byte数组来示硬件地址。 在ARP请求中,将目的硬件地址设置为广播地址,发送到局域网中的所有设备;在ARP响应中,将源硬件地址设置为自己的MAC地址,并发送给ARP请求中指定的IP地址。 收到ARP响应后,解析数据包中的源硬件地址,即可获得目标IP地址对应的MAC地址。可以使用Java中的PacketCapture技术来监听网络中的数据包,通过解析数据包的内容,提取出源硬件地址,从而获得目标IP地址对应的MAC地址。 总而言之,通过Java的Socket编程和PacketCapture技术,我们可以自定义ARP实现地址解析的功能,从而实现局域网中IP地址和物理硬件地址的映射操作。 ### 回答3: 在Java中自定义ARP(地址解析协议)是一项有挑战性的任务,需要深入了解网络编程和协议栈的工作原理。以下是一个大致的步骤来自定义ARP的实现。 1. 创建一个Java类来处理ARP请求和响应。该类需要实现ARP协议规范,并提供方法来发送和接收ARP消息。 2. 使用Socket编程来发送和接收ARP消息。你可以使用Java的Socket类或者更底层的DatagramSocket类来实现。 3. 通过创建一个以太网帧来封装ARP消息。以太网帧由目标和源MAC地址、帧类型和数据组成。ARP消息需要构建特定的数据结构来包含IP地址和MAC地址之间的映射。 4. 在发送ARP请求之前,你需要获取本地IP地址和MAC地址。这可以通过使用InetAddress类来实现。 5. 实现ARP缓存。ARP缓存是用于存储最近收到的ARP请求和响应的格,以便在需要时进行快速查询。你可以使用HashMap或者其他数据结构来实现ARP缓存。 6. 处理ARP请求和响应。当收到ARP请求时,你需要检查本地缓存中是否有对应的IP地址和MAC地址映射。如果有,则发送ARP响应,否则忽略该请求。当收到ARP响应时,你需要更新ARP缓存。 7. 添加定时器和超时机制。ARP协议具有超时机制,如果对应IP地址的MAC地址无法解析,需要重新发送ARP请求。你可以通过添加定时器和超时机制来实现这一功能。 需要注意的是,自定义ARP需要在操作系统层面上进行修改,所以你需要具备相应的管理员权限,并且需要了解操作系统的网络协议栈实现。此外,自定义ARP还需要考虑网络安全性和性能方面的问题。建议在进行实际操作之前进行充分的测试和评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值