2012-10-16 50 views
2

我正嘗試在我的C#應用​​程序中接收WOL包。我猜爲什麼它不起作用的問題與運行DD-WRT的路由器如何播放軟件包有關。C#無法使用UdpClient接收WOL包

我用收到UDP包代碼:

UdpClient udp = new UdpClient(10); 
    IPEndPoint all = new IPEndPoint(IPAddress.Any, 0); 
    while (true) 
    { 
    System.Diagnostics.Debug.Print("listening"); 
    byte[] receivedBytes = udp.Receive(ref all); 
    System.Diagnostics.Debug.Print(Encoding.ASCII.GetString(receivedBytes)); 
    } 

這已經與我的舊路由器的工作,但現在我有DD-WRT運行,它必須建立這樣的: 我端口轉發在端口10上到達(不存在)IP的輸入UDP包192.168.1.254 在路由器啓動時,執行命令「arp -i br0 -s 192.168.1.254 FF:FF:FF:FF:FF:FF」以廣播在該IP上收到的消息。 這個設置工作正常,每臺機器都會收到一個魔術包,我可以從我的網絡外部喚醒它們。 WireShark能夠捕獲這個包,但「udp.Receive(ref all);」不是。這是怎樣一個WOL包發送到我的路由器看起來像Wireshark的: http://i.stack.imgur.com/nxaAP.png

如果我(從我的C#應用​​程序中)廣播的UDP MagicPackage,另一方面送,這個包是我的代碼收到以上。這MagicPackage顯示了在Wireshark的是這樣的: http://i.stack.imgur.com/tPU1v.png

所以我不是100%肯定,如果不同的「目標」(192.168.1.254與255.255.255.255),或者不同的「Protocoll」(WOL與UDP)是問題。我的猜測是,UdpClient忽略了WOL包,因爲它的目的地(IP頭內)是一個不同的IP地址(代碼在機器192.168.1.2上運行)。另一方面,第二個包在其IP報頭中具有「255.255.255.255」的目的地地址,並因此被UdpClient捕獲。

所以最大的問題是:我如何設置一個UDP偵聽器,同時接收由我的路由器廣播的WOL包?

BTW:我也已經與這個代碼,但沒有任何的運氣試了一下:

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
EndPoint iep = new IPEndPoint(IPAddress.Any, 10); 
sock.Bind(iep); 
byte[] data = new byte[1024]; 
int recv = sock.ReceiveFrom(data, ref iep); 

回答

1

入住這家酒店: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.enablebroadcast.aspx 我相信WOL數據包廣播。在這種情況下它應該有所幫助。

編輯:

檢查您的Wireshark的截圖後,我認爲這個問題是不是在你的代碼。據我所知,網絡堆棧中有很多過濾器。第一個是MAC過濾器。由於廣播地址ff:ff:ff .... WOL數據包將經過。第二個過濾器位於IP地址上。您的WOL數據包具有目標IP ... 1.254,但您的操作系統預計... 1.2,因此IP堆棧將丟棄此數據包,您的應用程序將不會收到任何內容。另一側的Wireshark將網卡切換到「混雜模式」,在該模式下所有過濾器都關閉,wireshark能夠捕捉所有內容。爲Wireshark的使用一些捕獲庫

1)可以實現類似的行爲 - 看看Winpcap的 - http://www.winpcap.org/

2)儘量使用原始套接字,但我不知道這: 因此,要解決這個問題將工作 - http://en.wikipedia.org/wiki/Raw_socket

3)最好的辦法是修復你的路由器以標準格式發送WOLs。

+0

謝謝,但我已經嘗試過,並沒有改變任何東西。 :-( – Maik

+0

我無法使用原始套接字,但使用http://sourceforge.net/projects/sharppcap/(.net端口的winpcap)我能夠捕獲數據包。謝謝 – Maik