【问题标题】:How do I read and write raw ip packets from java on a mac?如何在 mac 上从 java 读取和写入原始 ip 数据包?
【发布时间】:2010-09-07 14:10:07
【问题描述】:

发送和接收原始网络数据包的最简单方法是什么。我是否必须为某些 c API 编写自己的 JNI 包装,在这种情况下,我要寻找什么 API?

编辑:我希望能够做wireshark 所做的事情,即在接口上记录所有传入的数据包,此外还能够发回我自己创建的数据包。我想在 Mac 上做。

【问题讨论】:

    标签: java macos networking


    【解决方案1】:

    如果您从需要类似数据包嗅探器的想法开始,您会想要查看http://netresearch.ics.uci.edu/kfujii/jpcap/doc/

    【讨论】:

      【解决方案2】:

      到目前为止,我最好的选择似乎是 BPF api 并编写一个精简的 JNI 包装器

      【讨论】:

        【解决方案3】:

        Raw Socket for Java 是长期对 JDK 的请求。请参阅请求here。那里有很长的讨论,您可以在其中寻找解决方法和解决方案。我曾经需要它来进行简单的 PING 操作,但我不记得我是如何解决这个问题的。对不起:)

        【讨论】:

          【解决方案4】:

          您无法从纯 Java 访问原始套接字,因此您需要在 Java 代码和网络接口之间设置某种层。

          另请注意,对原始套接字的访问通常仅适用于“根”进程,否则任何用户都可以 a) 嗅探所有流量,以及 b) 生成欺骗数据包。

          与其编写整个程序以使其需要以“root”身份运行,不如考虑在具有某种 IPC(RMI、命名管道、TCP 套接字等)的独立程序中完成数据包捕获和生成与您的 Java 应用交换数据。

          【讨论】:

          • 任何平台无关的解决方案?
          • @Pacerier 根据定义,它不能独立于平台,尽管有些库知道平台并隐藏这些依赖项。
          • 为什么它不能独立于平台?
          • @Pacerier 因为每个平台都有不同的 API 来允许访问原始套接字。
          • 每个平台都有不同的方法来做即使是最基本的东西。这并不意味着它不能独立于平台。我宁愿说 Java 没有为它提供独立于平台的接口。
          【解决方案5】:

          TINI 是一个 java 以太网控制器,它可能具有用于直接访问从以太网帧到 TCP 流的数据的库和类。您也许可以在其中找到实现所需类的东西。如果没有,应该有指针或用户组可以让您领先一步。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-02
            • 2011-09-14
            • 2019-10-25
            • 2012-10-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多