【问题标题】:Is there a way in java to listen to UDP broadcast msgs AND get the source IP address and Mac that the message was sent fromjava中有没有办法监听UDP广播消息并获取源IP地址和发送消息的Mac
【发布时间】:2017-12-23 03:20:00
【问题描述】:

我需要创建一个功能类似于 WireShark 的 Java 应用程序,因为它能够侦听 UDP 流量。但是我需要了解更多关于数据报的信息,而不仅仅是数据,我需要知道发送者的 IP 和 MAC 地址。有没有办法在 Java 中实现这一点?

这是我正在谈论的 Wireshark 的屏幕截图

WireShark Image

请注意,以太网 II 堆栈具有 mac,而 Internet 协议版本 4 具有 Src Ip。

这种情况的用例是网络上有多个设备发出数据(因为在这个消息中是 STS:ANT:OK:8)。但我需要知道这个发件人的 mac 和 IP 是什么,以便我可以按发件人和 mac 对 msgs 进行分类。 (从技术上讲,我可以在网络上有重复的 IP。)所以两者都是需要的。这也允许我显示发生这种情况的错误情况。

【问题讨论】:

  • MAC 将毫无意义。如果源不在您的本地网段上,则 MAC 将是路由器的 MAC,而不是源。
  • “从技术上讲,我可以在网络上拥有重复的 IP” - 真的吗?那不是一个功能网络。我在这里闻到了XY Problem
  • 您可以从DatagramPacket 获取IP 地址,但要获取MAC,您必须求助于jpcap 之类的东西
  • 你需要解决的实际问题是什么?
  • @jim Mac 实际上并非毫无意义,没有路由器,IP 是静态的,所以如果有人可以在同一个网络上放置重复的硬件......不好但可能

标签: java networking udp


【解决方案1】:

IP 协议是 UDP/TCP 或其他层的底层工具。您可能需要捕获数据包并监听特定端口(过滤 UDP 端口的 IP 消息)

否则,您可以使用外部服务器命令来更有效地完成它。

这是一个例子(来自How could I sniff network traffic in Java?):

public static void main(String[] args) throws Exception {
    File f = new File("sample.pcap");

    EthernetDecoder eth = new EthernetDecoder();
    IpDecoder ip = new IpDecoder();
    TcpDecoder tcp = new TcpDecoder(new TcpPortProtocolMapper());
    UdpDecoder udp = new UdpDecoder(new UdpPortProtocolMapper());

    eth.register(EthernetType.IPV4, ip);
    ip.register(InternetProtocol.TCP, tcp);
    ip.register(InternetProtocol.UDP, udp);

    PcapInputStream is = new PcapFileInputStream(f);
    while (true) {
        // getPacket() will throws EOFException and you should call is.close() 
        PcapPacket packet = is.getPacket();
        eth.decode(packet);
    }
}

【讨论】:

  • 有意思,等我回来试试这个
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2021-07-26
  • 2011-11-16
  • 1970-01-01
相关资源
最近更新 更多