2012-10-16 3 views
2

C# 응용 프로그램 내에서 WOL 패키지를 받으려고합니다. 왜 그것이 작동하지 않는 문제는 패키지가 DD-WRT를 실행하는 라우터에서 어떻게 방송되는지와 관련이 있다고 생각합니다.C# UdpClient를 사용하여 WOL 패키지를 수신 할 수 없습니다.

내가 UDP 패키지를 수신하는 데 사용하는 코드 : I 포트 포워드 :

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이 실행되고 있으며이 같은 설정을해야했다 (존재하지 않는) IP 192.168.1.254에 들어오는 UDP 꾸러미 "arp -i br0 -s 192.168.1.254 FF : FF : FF : FF : FF : FF"명령을 브로드 캐스트하기 위해 라우터가 시작될 때 실행됩니다 해당 IP에서 수신 한 메시지 이 설정이 작동하면 모든 컴퓨터에서 마법 패키지를 수신하고 네트워크 외부에서 깨울 수 있습니다.

WireShark는이 패키지를 포착 할 수 있지만 "udp.Receive (ref all);" 아니다. 나는 반면에, 방송 UDP MagicPackage (내 C# 응용 프로그램 내에서) 보낼 경우,이 패키지는 위의 내 코드에 의해 http://i.stack.imgur.com/nxaAP.png

을 수신하십시오 WOL 패키지 내 라우터 와이어 샤크의 모양에 보내는 방법이다. 그래서 http://i.stack.imgur.com/tPU1v.png

나는 다른 "대상"(255.255.255.255 대 192.168.1.254) 또는 다른 "Protocoll"(UDP 대 WOL)이 100 % 확실하지있어 경우 :이 MagicPackage는 다음과 같이 와이어 샤크에 표시 문제. 내 생각 엔, UdpClient가 WOL 패키지를 무시한다는 것은 IP 헤더 내의 대상이 다른 IP 주소 (코드가 컴퓨터 192.168.1.2에서 실행되고 있기 때문에)를 무시한다는 것입니다. 반면에 두 번째 패키지는 IP 헤더에 "255.255.255.255"의 대상 주소를 가지므로 UdpClient에 의해 catch됩니다.

그래서 큰 질문은 : 라우터에서 브로드 캐스팅하는 WOL 패키지를 수신하는 UDP 수신기를 어떻게 설정합니까?

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 필터입니다. WOL 패킷은 브로드 캐스트 주소 ff : ff : ff .... 때문에 통과 할 것입니다. 두 번째 필터는 IP 주소에 있습니다. WOL 패킷의 대상 IP는 1.254입니다.하지만 OS가 예상하고있는 것 ... 1.2 및 그 이후로 IP 스택이이 패킷을 던져서 앱이 아무 것도받지 못합니다. 반대편에있는 Wireshark는 네트워크 카드를 "무차별 모드"로 전환하여 모든 필터가 꺼져 있고 wireshark가 모든 것을 캡처 할 수 있습니다. 그래서이 문제를 해결하려면 다음

1)은 비슷한 동작을 구현할 수 있습니다 Wireshark를 일부 캡처 라이브러리를 사용하는 등 -은 WinPcap 한 번 봐 걸릴 - RAW 소켓을 사용해보십시오) http://www.winpcap.org/

2,하지만 난이 있는지 확실하지 않다 작동 할 것입니다 - http://en.wikipedia.org/wiki/Raw_socket

3) 가장 좋은 방법은 WOL을 표준 형식으로 보내도록 라우터를 수정하는 것입니다.

+0

감사합니다.하지만 이미 시도해 봤지만 아무 것도 변경하지 않았습니다. :-( – Maik

+0

원시 소켓을 사용할 수 없지만 http://sourceforge.net/projects/sharppcap/ (winpcap의 .net 포트) 패킷을 캡처 할 수있었습니다. 감사합니다. – Maik