2015-03-31 76 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