2017-03-23 6 views
1

データグラムソケットでこの奇妙な問題が発生しました。基本的に私がやっているのは、自分のアプリケーションが実装しているサービスをアナウンスし、同じネットワーク上の他のインスタンスとそのサービスを発見できるクラスを構築することです。 DatagramSocketクラスを使用してパケットを255.255.255.255にブロードキャストし、ネットワーク上の他のアプリケーションがそれに応答します。 これは、電話機のアプリケーションがデスクトップ上のアプリケーションを検出しようとしているときに完全に機能します。しかし、デスクトップ上のアプリは私の電話でそれを発見することはできません。 wiresharkを実行してパケットを監視していますが、電話機がパケットを期待通りに送信していますが、デスクトップアプリケーションはパケットを送信しません。 私は、アプリが自分のデスクトップからブロードキャストパケットを送信できないが、それが自分の携帯電話から実行されているときにそうすることができる理由があるかどうかを調べようとしていますか?DatagramSocketは電話でブロードキャストパケットを送信できますが、PCではブロードキャストパケットを送信できません

Windowsファイアウォールをオンまたはオフにしてコードをテストしました(使用しているファイアウォールのみ)。私はこの上をテストしている

デバイスは、以下のとおりです。

  • Lumia 950XL(Win10 V1607は14393の構築) -
  • 表面帳(Win10 1607ビルド14393)をブロードキャストすることができます -
  • HP AIOをブロードキャストすることはできません

    : - (Win10 1607ビルド14393)ここで

をブロードキャストすることはできませんが、私は、パケットをブロードキャストするために使用していたコードです

'advertiserPort'と 'finderPort'はそれぞれ '1994'と '2206'として事前定義されています。 'BroadcastAddress'は255.255.255.255

です。Edit:私は同じ結果をMicrosoftから提供されたDatagramSocketサンプルも試しました。このサンプルは、PC上で実行しているときに何もブロードキャストできず、wiresharkはパケットが送信されていないことを示します。

+0

正しいポート番号でIPAnyを使用してパケットをリスンする必要があります。 – jdweng

+0

@jdwengあなたはもっと説明できますか?私はMSが提供したUWPサンプルに従った。それでもサンプルは機能しません。 – Rafael

+0

IPEndPoint localEndPoint =新しいIPEndPoint(IPAddress.Any、1994); – jdweng

答えて

0

私はついにこの問題を解決しました。理由は不明ですが、DatagramSocketは、電話で実行しているときにグローバルブロードキャストアドレス(255.255.255.255)にUDPパケットを送信できますが、PCで実行しているときはUDPパケットを送信できません。しかし、ダイレクトブロードキャストアドレス(192.168.1.255など)を使用すると、両方のプラットフォームで正常に動作します。

問題UWPは唯一のグローバルブロードキャストアドレスを取得するためのAPIを持っており、あなたの現在のネットワークのダイレクトブロードキャストアドレスを取得したい場合、あなたはそれを計算する必要があります、です。みんなの利益のために

ここで私は、そのアドレスを計算するコードを共有し、うまくいけば、MSは、この問題を解決します。

この方法は、デバイスのIPアドレスからのネットワークのサブネットマスクを取得に役立ちます:

public static IPAddress GetSubnetMask(IPAddress hostAddress) 
    { 
     var addressBytes = hostAddress.GetAddressBytes(); 

     if (addressBytes[0] >= 1 && addressBytes[0] <= 126) 
      return IPAddress.Parse("255.0.0.0"); 
     else if (addressBytes[0] >= 128 && addressBytes[0] <= 191) 
      return IPAddress.Parse("255.255.255.0"); 
     else if (addressBytes[0] >= 192 && addressBytes[0] <= 223) 
      return IPAddress.Parse("255.255.255.0"); 
     else 
      throw new ArgumentOutOfRangeException(); 
    } 

この方法は、ダイレクトブロードキャストアドレス与えるものです。もう一度

 public static IPAddress GetBroadastAddress(IPAddress hostIPAddress) 
    { 
     var subnetAddress = GetSubnetMask(hostIPAddress); 

     var deviceAddressBytes = hostIPAddress.GetAddressBytes(); 
     var subnetAddressBytes = subnetAddress.GetAddressBytes(); 

     if (deviceAddressBytes.Length != subnetAddressBytes.Length) 
      throw new ArgumentOutOfRangeException(); 

     var broadcastAddressBytes = new byte[deviceAddressBytes.Length]; 

     for (var i = 0; i < broadcastAddressBytes.Length; i++) 
      broadcastAddressBytes[i] = (byte)(deviceAddressBytes[i] | subnetAddressBytes[i]^255); 

     return new IPAddress(broadcastAddressBytes); 
    } 

を、別のデバイスファミリで動作しているときに、同じAPIの動作にそのような違いがある理由について私は考えていませんが、うまくいけば、このコードは誰かを助けるでしょう。

関連する問題