2012-12-01 2 views
3

데스크톱 앱에 연결하는 Win RT 앱을 만들고 UDP와 TCP로 통신하기 시작합니다.DatagramSocket이 UdpClient에서 데이터를받을 수 없습니다.

Win RT에서 Desktop으로 보내고 Desktop에서 Win RT로 보낼 수 있다는 점에서 TCP 통신을 성공적으로 구현했습니다. 데스크탑의 Win RT 및 TcpListener에서 StreamSocket 사용.

또한 Win RT에서 바탕 화면으로 Udp 데이터를 아무런 문제없이 보내도록 만들었습니다. 그러나 데스크톱에서 Win RT로 전송 된 데이터를받을 수 없습니다. 나는 다음 코드를 사용하는데 아무런 문제가 보이지 않지만 뭔가가 있어야한다.

var g = new DatagramSocket(); 
    g.MessageReceived += g_MessageReceived; 
    g.BindEndpointAsync(new HostName("127.0.0.1"), "6700"); 
    . 
    . 
    . 
    void g_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) 
    { // <- break point here. 

    } 

중단 점이 코드를 중지시키지 않으므로 메시지를받지 못합니다. 내 StreamSocket에서 reader.GetBytes()가 아닌 reader.GetBuffers()로 바이트를 가져와야하기 때문에 IBuffer 만 생각할 수 있습니다. 그러나 그것이 내가 데스크톱 RT가 아닌 데스크톱에서 생각할 필요가있는 것입니다. 왜냐하면 Tcp에서 단지 바이트를 보내고 Win RT에 버퍼를 가져 오기 때문에 DatagramSocket에 대해서도 마찬가지입니다.

  • 독자 = DataReader를

가 너희들을 감사드립니다.

+0

이 문서가 도움이 될 수 있습니다. http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx –

답변

5

새로운 DatagramSocket 클래스에 익숙하지 않지만 일반적으로 127.0.0.1에 바인딩한다는 것은 루프백 어댑터로 보낸 메시지 만 수신한다는 것을 의미합니다. 패킷이 다른 호스트에서 오는 것이므로 루프백 어댑터가 아닌 NIC에서 수신해야합니다.

편집 : 당신이 사용하고있는 DatagramSocket로 API의 문서보고에서, 당신은 단지 동일한 동작이 모든 어댑터에 지정된 포트에 바인딩하기 위해 대신 BindEndpointAsync()BindServiceNameAsync() 방법을 사용할 수 있습니다 아래 System.Net.Sockets API 예제를 참조하십시오. 따라서, 귀하의 예제에서, 당신은 할 것 : 물론

g.BindServiceNameAsync("6700"); 

, 당신은 또한 바탕 화면 호스트의 방화벽 설정이 지정된 포트에서 들어오는 UDP 패킷을 수신 할 수 있는지 확인하는 것이 좋습니다. 위의 코드에서, 당신은 분명 당신이를 통해 문자열을 보내는 어떤 인코딩을 사용해야

using System.Net; 
    using System.Net.Sockets; 

    public class UdpState 
    { 
     public UdpClient client; 
     public IPEndPoint ep; 
    } 

    ... 

    private void btnStartListener_Click(object sender, EventArgs e) 
    { 
     UdpState state = new UdpState(); 
     //This specifies that the UdpClient should listen on EVERY adapter 
     //on the specified port, not just on one adapter. 
     state.ep = new IPEndPoint(IPAddress.Any, 31337); 
     //This will call bind() using the above IP endpoint information. 
     state.client = new UdpClient(state.ep); 
     //This starts waiting for an incoming datagram and returns immediately. 
     state.client.BeginReceive(new AsyncCallback(bytesReceived), state); 
    } 

    private void bytesReceived(IAsyncResult async) 
    { 
     UdpState state = async.AsyncState as UdpState; 
     if (state != null) 
     { 
      IPEndPoint ep = state.ep; 
      string msg = ASCIIEncoding.ASCII.GetString(state.client.EndReceive(async, ref ep)); 
      //either close the client or call BeginReceive to wait for next datagram here. 
     } 
    } 

참고 :

다음 코드를 사용해보십시오. 내가 테스트 애플 리케이션을 썼을 때, 나는 ASCII로 문자열을 보냈다. 유니 코드로 보낼 경우 ASCIIEncoding.ASCII 대신 UnicodeEncoding.Unicode을 사용하면됩니다.

이것이 작동하지 않는다면 Wireshark와 같은 패킷 캡처 유틸리티를 사용하여 RT 호스트의 UDP 패킷이 실제로 데스크탑 호스트로 전달되는지 확인할 수 있습니다.

+0

'BindEndpointAsync'를'BindServiceNameAsync'로 변경해 보셨습니까? Windows 8 개발 도구가 없으므로 직접 시도 할 수는 없지만 MSDN 문서에서 코드가 변경된 것처럼 작동하는 것처럼 보입니다. 또한 Win 8 이전의 Windows 버전에서 코드를 실행할 수 있어야하는 경우 제공된 코드가 제대로 작동해야합니다. 나는 그것을 시험했다. – reirab

+0

아직 코드를 시도하지 않았지만 MSDN에 따라 IPAddress.Any에서 바인딩하는 것과 동일한 BindServiceNameAsync를 시도했지만 아무 일도 일어나지 않았습니다. 인코딩, 최대 바이트 크기 또는 일부 속성의 차이가 있어야합니다 같아요. – Peyman

+0

과 127.0.0.1이 동일한 IP로 에뮬레이터에서 테스트 중이므로 문제가되지 않습니다. 그러나, 내가 그것을했는지 확인하고 그것을 작동하지 않았다 :( – Peyman