2015-03-31 38 views
4

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

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广播的端口上可以实现,我们怎么能一个区域像什么路由器可以做内广播。

回答

2

如果你的意思是原始以太网广播,你不能从纯Java做到这一点。对于原始套接字,一种直接的方式(如果你知道将要执行的平台)是直接在本地代码中执行的,而不是直接使用本地代码,有一个适合你的Java系统其余部分的接口。

一个更复杂的选择是将本机代码包装到一个子类java.net.Socket中,该代码为代码的其余部分提供了一个标准接口,但可能会非常棘手,具体取决于您想要的Socket接口的多少实施,以及您可以承受多少依靠传播来解决问题以及呼叫代码是否正确。

第三个选项是使用原始以太网的现有库,请参阅 答案

对于特权的简短讨论打开原始套接字,参见例如 send/receiving raw ethernet frames

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

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

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

对于Python编程,对于 “原始以太网蟒蛇” 我得到的前3名谷歌的结果是

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

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

+0

非常感谢!想知道是否可以更多地解释以太网编程和原始套接字,以及如何在其他语言中实现它(例如Python) – Shane 2015-03-31 10:12:47

+1

回答更新了一些指针。为此,谷歌是你的朋友。 – drRobertz 2015-03-31 14:56:14