2

C#アプリケーション内でWOLパッケージを受信しようとしています。なぜそれが機能しないのかという問題は、DD-WRTを実行しているルーターによってパッケージがどのようにブロードキャストされるかに関係していると思います。

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の着信UDPパッケージを(存在しない)IP192.168.1.254にポート転送します。ルーターの起動時にコマンド「arp-ibr0-s 192.168.1.254 FF:FF:FF:FF:FF:FF」を実行して、そのIPで受信したメッセージをブロードキャストします。このセットアップは機能し、魔法のパッケージがすべてのマシンで受信され、ネットワークの外部からそれらをウェイクアップできます。

WireSharkはこのパッケージをキャッチできますが、「udp.Receive(refall);」です。ではありません。これは、Wiresharkでルーターに送信されるWOLパッケージがどのように見えるかを示しています:http: //i.stack.imgur.com/nxaAP.png

一方、(C#アプリケーション内から)Broadcasted UDP MagicPackageを送信すると、このパッケージは上記のコードで受信されます。このMagicPackageは次のようにWiresharkに表示されます:http: //i.stack.imgur.com/tPU1v.png

したがって、別の「宛先」(192.168.1.254と255.255.255.255)または別の「Protocoll」(WOLとUDP)が問題であるかどうかは100%わかりません。私の推測では、UdpClientはWOLパッケージを無視します。これは、宛先(IPヘッダー内)が別のIPアドレスであるためです(コードはマシン192.168.1.2で実行されています)。一方、2番目のパッケージのIPヘッダーには「255.255.255.255」という宛先アドレスが含まれているため、UdpClientによってキャッチされます。

したがって、大きな問題は、ルーターによってブロードキャストされたWOLパッケージも受信するUDPリスナーを設定するにはどうすればよいですか。

ところで:私もすでにこのコードで試しましたが、運がありませんでした:

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);
4

1 に答える 1

1

このプロパティを確認してください:http: //msdn.microsoft.com/en-us/library/system.net.sockets.socket.enablebroadcast.aspxWOL パケットがブロードキャストされていると思います。この場合、それは役立つはずです。

編集:

Wiresharkのスクリーンショットを確認した後、問題はコードにないようです。私の知る限り、ネットワークスタックには多くのフィルターがあります。1つ目はMACフィルターです。ブロードキャストアドレスff:ff:ff ...のため、WOLパケットは通過します。2番目のフィルターはIPアドレスにあります。WOLパケットの宛先IPは...1.254ですが、OSは... 1.2を期待しているため、IPスタックはこのパケットをスローし、アプリは何も受信しません。反対側のWiresharkは、ネットワークカードを「プロミスキャスモード」に切り替えます。このモードでは、すべてのフィルターがオフになり、wiresharkはすべてをキャプチャできます。したがって、これを解決するには:

1)キャプチャライブラリを使用してWiresharkと同様の動作を実装できます-WinPCAPをご覧ください-http : //www.winpcap.org/

2)RAWソケットを使用してみてください。ただし、これが機能するかどうかはわかりません-http://en.wikipedia.org/wiki/Raw_socket

3)最善の方法は、ルーターを修正してWOLを標準形式で送信することです。

于 2012-10-16T20:48:02.420 に答える