2016-07-31 20 views
2

私は、マルチキャストグループからデータを送受信する簡単なアプリケーションを作りました。アプリケーションの2つのインスタンス(同じコードを持つ2つの異なる.slnファイル)を開くと、データを送受信できます。問題は、5秒後に、Client001からメッセージを送信すると、Client001だけがメッセージを受け取ることです。しかし、5秒以内にClient002(アプリケーションの2番目のインスタンス)からメッセージを送信すると、両方のメッセージが表示されます。 私は完全に動作していたUdpClientのサンプルを持っていましたが、UWPでは使用できなくなりました。 結論として、(5秒以内ではなく)一部のクライアントがメッセージを送信しても、他のすべてのクライアントがそれを取得しても、どうすれば達成できますか?UWP DatagramSocketマルチキャスト

これは、これはMainPage.xamlを

<Page 
    x:Class="Client001.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:Client001" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d"> 


    <StackPanel> 
     <TextBlock>Remote Address:</TextBlock> 
     <TextBox x:Name="RemoteAddress" /> 

     <TextBlock>Service Name:</TextBlock> 
     <TextBox x:Name="ServiceName" /> 

     <Button x:Name="StartListener" Click="StartListener_Click" Margin="0,10,0,0"/> 
     <Button x:Name="SendMessageButton" Content="Send 'hello'" Click="SendMessage_Click" Margin="0,10,0,0"/> 
     <Button x:Name="CloseListenerButton" Content="Close Listener" Click="CloseListener_Click" Margin="0,10,0,0"/> 
     <TextBlock x:Name="SendOutput" TextWrapping="Wrap" Margin="0,10,0,0"/> 
     <TextBox x:Name="Message"></TextBox> 
    </StackPanel> 

</Page> 

UPDATEするためのコードである

namespace Client001 
{ 
    /// <summary> 
    /// An empty page that can be used on its own or navigated to within a Frame. 
    /// </summary> 
    public sealed partial class MainPage : Page 
    { 
     private DatagramSocket listenerSocket = null; 
     public string remoteAddress = "224.3.0.5"; 
     HostName remoteHostname; 
     public string serviceName = "22113"; 
     IOutputStream outputStream; 
     DataWriter writer; 

     public MainPage() 
     { 
      this.InitializeComponent(); 
      SetupMulticastScenarioUI(); 

      remoteHostname = new HostName(RemoteAddress.Text); 
     } 

     private void CloseListenerSocket() 
     { 
      if (listenerSocket != null) 
      { 
       // DatagramSocket.Close() is exposed through the Dispose() method in C#. 
       // The call below explicitly closes the socket, freeing the UDP port that it is currently bound to. 
       listenerSocket.Dispose(); 
       listenerSocket = null; 
      } 
     } 

     // Sets up the UI to display the multicast scenario options. 
     private void SetupMulticastScenarioUI() 
     { 
      RemoteAddress.Text = remoteAddress; 
      ServiceName.Text = serviceName; 
      StartListener.Content = "Start listener and join multicast group"; 
      SendMessageButton.IsEnabled = false; 
      CloseListenerButton.IsEnabled = false; 
      SendOutput.Text = ""; 
     } 

     private async void StartListener_Click(object sender, RoutedEventArgs e) 
     { 
      listenerSocket = new DatagramSocket(); 

      listenerSocket.Control.MulticastOnly = true; 
      await listenerSocket.BindServiceNameAsync(ServiceName.Text); 

      // Join the multicast group to start receiving datagrams being sent to that group. 
      listenerSocket.JoinMulticastGroup(remoteHostname); 

      listenerSocket.MessageReceived += MessageReceived; 
      SendOutput.Text = "Listening on port " + listenerSocket.Information.LocalPort + " and joined to multicast group"; 

      // Enable scenario steps that require us to have an active listening socket. 
      SendMessageButton.IsEnabled = true; 
      CloseListenerButton.IsEnabled = true; 

      outputStream = await listenerSocket.GetOutputStreamAsync(remoteHostname, ServiceName.Text); 
      writer = new DataWriter(outputStream); 
      writer.WriteString("Handshake1"); 
      await writer.StoreAsync(); 
     } 

     private async void SendMessage_Click(object sender, RoutedEventArgs e) 
     { 
      writer.WriteString(Message.Text); 
      await writer.StoreAsync(); 
     } 

     private void CloseListener_Click(object sender, RoutedEventArgs e) 
     { 
      CloseListenerSocket(); 

      // Disable scenario steps that require us to have an active listening socket. 
      SendMessageButton.IsEnabled = false; 
      CloseListenerButton.IsEnabled = false; 
      SendOutput.Text = ""; 

      SendOutput.Text = "Listener closed"; 
     } 

     async void MessageReceived(DatagramSocket socket, DatagramSocketMessageReceivedEventArgs eventArguments) 
     { 
      // Interpret the incoming datagram's entire contents as a string. 
      uint stringLength = eventArguments.GetDataReader().UnconsumedBufferLength; 
      string receivedMessage = eventArguments.GetDataReader().ReadString(stringLength); 

      await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
      { 
       SendOutput.Text = "Received data from remote peer (Remote Address: " + 
        eventArguments.RemoteAddress.CanonicalName + ", Remote Port: " + 
        eventArguments.RemotePort + "): \"" + receivedMessage + "\""; 
      }); 
     } 
    } 
} 

MainPage.xaml.csするためのコードである:のビットの後私はTTL(Time To Live)が問題だと知りましたが、この問題を解決する方法はまだ分かりません。

答えて

2

結論として、(5秒以内ではなく)一部のクライアントがメッセージを送信しても、他のすべてのクライアントがそれを取得しても、どうすれば達成できますか?

この問題は、最新のWindows RS1(14393の構築) OSで修正されたことを、ここではスクリーンショット(GIF)があるように思え: enter image description here

あなたがにOSをアップグレードする必要があるかもしれませんそれを解決する。

+0

ありがとうございました。それほど問題でないなら、[this](http://stackoverflow.com/questions/38684400/event-handler-is-executed-more-than-once)の質問を見て、その問題がよく – Stefan

+0

@Stefan私はオフィスに戻っても確認します:)この回答はあなたの質問に答えていますか?:) –

+0

私はWindows 10を最新バージョンに更新していますのでお知らせします。 – Stefan

関連する問題