C# Невозможно получить пакет WOL с UdpClient
Я пытаюсь получить пакет WOL в моем приложении C#. Я предполагаю, что проблема, почему это не работает, имеет отношение к тому, как пакет транслируется моим маршрутизатором с 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, и его нужно было настроить следующим образом: я перенаправляю входящие пакеты UDP на порт 10 на (несуществующий) IP 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:
Если я отправляю (из моего приложения C#) широковещательный пакет UDP MagicPackage, с другой стороны, этот пакет получен моим кодом выше. Этот MagicPackage отображается в Wireshark следующим образом:
Так что я не уверен на 100%, является ли проблема другим "Назначением" (192.168.1.254 против 255.255.255.255) или другим "Протоколлом" (WOL против UDP). Я предполагаю, что UdpClient игнорирует пакет WOL, потому что его назначение (в заголовке IP) - это другой IP-адрес (код выполняется на компьютере 192.168.1.2). Второй пакет, с другой стороны, имеет адрес назначения "255.255.255.255" в своем заголовке IP и поэтому перехватывается UdpClient.
Итак, главный вопрос: как мне настроить прослушиватель UDP, который также получает пакет WOL, транслируемый моим маршрутизатором?
Кстати, я тоже уже пробовал это с этим кодом, но без какой-либо удачи:
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. Пакет WOL пройдет через широковещательный адрес ff:ff:ff.... Второй фильтр находится на IP-адресе. Ваш пакет WOL имеет IP-адрес назначения...1.254, но ваша ОС ожидает... 1.2, и поэтому стек IP выбросит этот пакет, и ваше приложение ничего не получит. Wireshark с другой стороны переключает сетевую карту в "беспорядочный режим", когда все фильтры отключены, и Wireshark может захватывать все. Итак, чтобы решить это:
1) Вы можете реализовать поведение, аналогичное Wireshark, используя некоторую библиотеку захвата - взгляните на WinPCAP - http://www.winpcap.org/
2) Попробуйте использовать RAW-сокеты, но я не уверен, что это сработает - http://en.wikipedia.org/wiki/Raw_socket
3) Лучшим способом было бы исправить ваш маршрутизатор для отправки WOL в стандартном формате.