2012-03-11 22 views
3

UDPブロードキャストとマルチキャスティングについての私の理解は非常に限定されていると言います。これが私の最初のプロジェクトです。UDPクライアントからのUDPマルチキャストへの対応方法

私はC#デスクトップクライアントをマシンとWindows phone 7アプリケーションで実行しています。 WP7アプリケーションは、ネットワーク経由でUDPブロードキャストを送信することになっており、デスクトップクライアントはUDPマルチキャストをリッスンし、それに従って応答することになっています。これは、デスクトップクライアントを実行しているマシンを見つけるために、ネットワーク上の単純なマシンディスカバリを意味します。

C#デスクトップクライアントコード

public class ConnectionListener 
{ 
    private const int UDP_PORT = 54322; 
    private static readonly IPAddress MULTICAST_GROUP_ADDRESS = IPAddress.Parse("224.0.0.1"); 

    private UdpClient _listener; 

    public ConnectionListener() 
    { 
     _listener = new UdpClient(UDP_PORT, AddressFamily.InterNetwork); 
     _listener.EnableBroadcast = true; 
     _listener.JoinMulticastGroup(MULTICAST_GROUP_ADDRESS); 

     _listener.BeginReceive(ReceiveCallback, null); 
    } 

    private void ReceiveCallback(IAsyncResult result) 
    { 
     IPEndPoint receiveEndpoint = new IPEndPoint(IPAddress.Any, UDP_PORT); 
     byte[] receivedBytes = _listener.EndReceive(result, ref receiveEndpoint); 

     byte[] response = Encoding.UTF8.GetBytes("WPF Response"); 
     _listener.BeginSend(response, response.Length, receiveEndpoint, SendCallback, null); 
    } 

    private void SendCallback(IAsyncResult result) 
    { 
     int sendCount = _listener.EndSend(result); 
     Console.WriteLine("Sent Count is: " + sendCount); 
    } 
} 

WP7 Serverコード:

public class MachineDetector 
{ 
    public const int UDP_PORT = 54322; 
    private const string MULTICAST_GROUP_ADDRESS = "224.0.0.1"; 

    UdpAnySourceMulticastClient _client = null; 
    bool _joined = false; 

    private byte[] _receiveBuffer; 
    private const int MAX_MESSAGE_SIZE = 512; 

    public MachineDetector() 
    { 
     _client = new UdpAnySourceMulticastClient(IPAddress.Parse(MULTICAST_GROUP_ADDRESS), UDP_PORT); 
     _receiveBuffer = new byte[MAX_MESSAGE_SIZE]; 

     _client.BeginJoinGroup(
      result => 
      { 
       _client.EndJoinGroup(result); 
       _client.MulticastLoopback = false; 
       SendRequest(); 
      }, null); 
    } 

    private void SendRequest() 
    { 
     byte[] requestData = Encoding.UTF8.GetBytes("WP7 Multicast"); 

     _client.BeginSendToGroup(requestData, 0, requestData.Length, 
      result => 
      { 
       _client.EndSendToGroup(result); 
       Receive(); 
      }, null); 
    } 

    private void Receive() 
    { 
     Array.Clear(_receiveBuffer, 0, _receiveBuffer.Length); 
     _client.BeginReceiveFromGroup(_receiveBuffer, 0, _receiveBuffer.Length, 
      result => 
      { 
       IPEndPoint source; 

       _client.EndReceiveFromGroup(result, out source); 

       string dataReceived = Encoding.UTF8.GetString(_receiveBuffer, 0, _receiveBuffer.Length); 

       string message = String.Format("[{0}]: {1}", source.Address.ToString(), dataReceived); 
       Console.WriteLine(message); 

       Receive(); 
      }, null); 
    } 
} 

私はデスクトップクライアントでデータを受信することができていますが、WP7アプリが受信できていないようです応答。私はしばらくの間、これについて私の頭を叩いていたし、他にどこを見なければわからない。どんな助けも素晴らしいだろう。

WP7アプリが応答を受信しない理由は何ですか?

答えて

0

ConnectionListener:ReceiveCallbackC# Desktop Clientに問題があると思います。

_listener.BeginSend(response, response.Length, 
     receiveEndpoint, SendCallback, null); 

代わりに、このメッセージは、マルチキャストアドレスに送信されます

_listener.BeginSend(response, response.Length, 
     SendCallback, null); 

を呼び出します。これにさらにヘルプについては効率的に1回の掃引ですべてのデスクトップクライアントに到達するために、ネットワークにマルチキャストするを必要How to: Send and Receive Data in a Multicast Group for Windows Phone.

+0

@AlRodriguezあなたの権利。 [MSDN](http://msdn.microsoft.com/en-us/library/dx13cwba.aspx)では、 'BeginSend'について、'接続先の呼び出しによって先を先に指定する 'ことについて述べています。しかし、マルチキャストされたデータグラムを受信しようとするなら、Connectメソッドを呼ばないでください。 – user1055604

0

WP7を参照してください。クライアントの応答については、唯一の目的地はWP7です。このように、マルチキャストには実際の利点はありません(マルチキャストに調整されたデスクトップクライアントは効果的にそれを無視するため)。

代わりに、あなたはWP7サーバにunicast応答を送信するためにConnectionListener:ReceiveCallbackEndReceiveへの呼び出しによって移入receiveEndpointを使用することができます。 MSDNにマルチキャストアプリケーションを作成する場合は、considerationをお勧めします。

この方法では、WP7は着信マルチキャストグループのjoinを必要とせず、デスクトップクライアントはsendマルチキャストに応答する必要はありません。

関連する問題