2016-09-27 6 views
0

다음과 같은 간단한 배열로 인해 무엇이 잘못 되었습니까? 내가하고있는 일은 메시지를 멀티 캐스트하는 UDP 광고주와이 메시지를 받기 위해 멀티 캐스트 그룹에 조인하는 수신기를 만드는 것입니다. 둘 다 동일한 컴퓨터에서 실행됩니다.소켓을 통한 광고/청취가 가장 간편합니다.

string Port = "54153"; 
HostName Host = new HostName("224.3.0.5"); //a multicast range address 

//listener 
var L = new DatagramSocket(); 
L.MessageReceived += (sender2, args) => { /*something*/ }; 
await L.BindServiceNameAsync(Port); 
L.JoinMulticastGroup(Host); 

//advertiser 
var AdvertiserSocket = new DatagramSocket(); 
AdvertiserSocket.Control.MulticastOnly = true; 

Stream outStream = (await AdvertiserSocket.GetOutputStreamAsync(Host, Port)).AsStreamForWrite(); 
using (var writer = new StreamWriter(outStream)) 
{ 
    await writer.WriteLineAsync("MESSAGE"); 
    await writer.FlushAsync(); 
} 

리스너는 모든 (호출되지 않습니다 MessageReceived)에서 아무것도받지 않습니다. 성공하지 못한 다음 변형을 시도했습니다.

  1. 광고주에서 BindServiceNameAsync()를 호출하고 호출하지 않습니다.
  2. 광고주, 수신기 또는 둘 모두에서 MulticastOnly 사용
  3. 하나의 개체를 다른 개체보다 먼저 만든 후 잠시 기다리십시오.
  4. 255.255.255.255을 호스트로 사용합니다. 광고주가 (TCPView가 패킷을 전송 방송) 제대로 데이터를 멀티 캐스팅되지만 수신 포트가 아무것도 못하고처럼
+0

[이 비슷한 케이스] (http://stackoverflow.com/questions/38679646/uwp-datagramsocket-multicast/38739116#38739116)가 도움이되는지 확인하십시오. –

+0

@ ElvisXia-MSFT : 감사합니다. Elvis. 제공 한 링크는 샘플 중 하나를 사용합니다 (UWP API 샘플의 시나리오 5). 이것이 바로 내가 시작한 것입니다. 이 샘플의 문제점은 단일 DatagramSocket을 사용하고 동일한 소켓에서 광고하고 청취한다는 것입니다. 필자의 경우, 동일한 머신에서 두 개의 DatagramSocket 객체가 실행된다. 그 중 하나는 멀티 캐스팅하는 광고주이고 다른 하나는 멀티 캐스트 데이터를 수신 대기하는 수신기입니다. 이 특정 시나리오에서 리스너는 아무 것도 수신하지 않습니다. – dotNET

+0

@ ElvisXia-MSFT : 위의 코드를 빈 UWP 응용 프로그램에 복사하여 붙여 넣기 만하면됩니다. 내가 말하는 행동을 보게 될거야. – dotNET

답변

2

는 것 같습니다.

이 문제를 공유해 주셔서 감사합니다. 나는 데모를 만들었고 몇 가지 검사를했다. 리스너 소켓이 그룹에서 하나의 메시지를 보낼 때까지 어떤 메시지도 수신하지 못한다는 것을 알았습니다. 내가 관련 팀과 협의하고 당신은 내가 한 번 알려 드리겠습니다,이 문제의 근본 원인에 관해서는

private async void btnListen_Click(object sender, RoutedEventArgs e) 
{ 
     socket = new DatagramSocket(); 
     socket.MessageReceived += Socket_MessageReceived; 
     socket.Control.MulticastOnly = true; 
     await socket.BindServiceNameAsync(serverPort); 
     socket.JoinMulticastGroup(serverHost); 
     SendWithExistingSocket(socket, "");//send an empty message immediately 
} 

private async void SendWithExistingSocket(DatagramSocket socket, String text) 
{ 
    if (socket != null) 
    { 
     Stream stream = (await socket.GetOutputStreamAsync(serverHost, serverPort)).AsStreamForWrite(); 
     using (var writer = new StreamWriter(stream)) 
     { 
      writer.WriteLine(text); 
      await writer.FlushAsync(); 
     } 
    } 
} 

:

그래서, 현재 해결 방법은 듣기에 등록 직후 빈 메시지를 보내는 것입니다 응답을 받았습니다.

+0

감사합니다. Elvis. 그것은 트릭을했다. 실제로이 문제의 원인에 대한 귀하의 의견을 기다리게 될 것입니다. – dotNET

+0

방금이 문제를 해결했습니다. 문제가 해결 되었습니까? –