4

我注意到路由器如何在一个区域内发送广播数据包,以允许无线网络连接,从而允许网络访问。我的问题是我们如何在java中实现这样的东西?我知道如何“UDP 广播”,但这并不是我想要做的广播类型。

import java.net.*;

class Broadcast{ //Example of UDP Broadcast Server
     public static void main(String[] args){
          DatagramSocket broadcastserver = new DatagramSocket(80);
          broadcastserver.setBroadcast(true);
          ...
          ...

总之,不是像UDP广播那样在端口上广播,我们怎么能像路由器那样在一个区域内广播。

4

1 回答 1

2

如果你的意思是原始以太网广播,你不能从纯 Java 中做到这一点。(顺便说一句,您的问题是否与此重复:如何通过 java 或 Android 读取或获取 WLAN 中的接入点发送的信标帧的信息?

对于原始套接字,一种直接的方法(如果您知道将在哪个平台上执行)是直接在本机代码中执行,并具有与 Java 系统其余部分的合适接口。

一个更复杂的选择是将本机代码包装在 java.net.Socket 的子类中,这为其余代码提供了一个标准接口,但可能会很棘手,具体取决于您要实现多少 Socket 接口,以及如何实现依靠约定进行寻址并且调用代码是正确的,您可以负担得起很多。

第三种选择是使用现有的原始以太网库,参见例如答案

有关打开原始套接字的权限的简要讨论,请参见例如 发送/接收原始以太网帧

更新:有关以太网(编程)的更多详细信息:评论中的问题。

首先,关于以太网帧的维基百科文章很好地介绍了该协议:http ://en.wikipedia.org/wiki/Ethernet_frame 。

关于编程,无聊的答案是阅读 SOCK_RAW,从 socket(2) 的手册页开始。创建原始套接字后,您基本上创建一个帧(作为字节数组)并使用 write(2) 或 sendto(2) 发送它并使用 read(2) 或 recvfrom(2) 读取。创建以太网帧时,请使用维基百科文章获取正确的格式。

对于 Python 编程,我得到的“原始以太网 python”的前 3 个谷歌搜索结果是

这似乎是一个合理的起点。

如需更全面的文章, http://www.binarytides.com/python-packet-sniffer-code-linux/ 可能值得一读。

于 2015-03-31T09:44:19.447 回答