2016-09-27 82 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作爲主機。
+0

請檢查是否[this similar case](http://stackoverflow.com/questions/38679646/uwp-datagramsocket-multicast/38739116#38739116)有幫助。 –

+0

@ ElvisXia-MSFT:謝謝埃爾維斯。您提供的鏈接使用其中一個示例(UWP API示例中的scenario5)。這正是我開始的。這個示例的問題在於它使用一個'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

謝謝埃爾維斯。那就是訣竅。我會等待你的投入,看看究竟是什麼造成的。 – dotNET

+0

我剛剛遇到這個問題,這是固定的? –