2015-09-07 22 views
8

私がいくつかのマルチキャストチュートリアルを採用した際、私は自分のパケット送信方法を変更しました。マルチキャストパケット:送受信の問題

私の場合、私は

問題、それはすべてのオンラインのネットワークアダプタを介してSocket.Send()を介して送信された後、サイズbytes[1024]のパケットのキューを作成します。

送信する場合は、receiveMessage()と呼ばれる別の方法があります別のスレッドで実行しています。 Socket.Bind()を使用すると、パケットをキャプチャしますが、キャプチャされるパケットは1つだけです。

私はあまりにも多くの処理をしていますので、受信したパケットを遅延させてしまいます。

UPDATE

私はこのように、着信パケットのために1つのスレッドをキャプチャして保存、第二のプロセスのパケットをキューに追加することを検討しています。あなたはこれらの再利用可能な使用することができますhttps://github.com/efaruk/playground/tree/master/Multicasting

SendMethod

Socket _listener_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

foreach (IPAddress localIP in Dns.GetHostAddresses(Dns.GetHostName()).Where(i => i.AddressFamily == AddressFamily.InterNetwork)) 
{ 
    //handle image and files     
    _listener_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(_MultiIP, localIP)); 
    _listener_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 1); 
    _listener_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
    _listener_socket.MulticastLoopback = true; 
    _listener_socket.Connect(new IPEndPoint(_MultiIP, _PORT)); 

    int count = MSGS_TO_SEND.Count; 

    while (count > 0) 
    { 
     count--; 
     byte[] temp = (byte[])(MSGS_TO_SEND.Dequeue()); 
     _listener_socket.Send(temp, _BYTE_BUFFER_SIZE, SocketFlags.None); 
     MSGS_TO_SEND.Enqueue(temp); 
    }    

    //---------------------------------------------- 
    //-------------------SEND DATA------------------ 
    //---------------------------------------------- 
} 

_listener_socket.Close(); 

は、あなたがしようとするwan't場合は、ここで完全に作業例である方法

//initialise multicast group and bind to interface 
Socket _sender_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, _PORT); 
_sender_socket.Bind(ipep); 

IPAddress localip = _MultiIP; 
_sender_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(localip, IPAddress.Any)); 

//{ 
while (_sender_socket.IsBound && !bStop) 
{ 
    byte[] b = new byte[_BYTE_BUFFER_SIZE]; 
    _sender_socket.Receive(b); 
    char[] chars = new char[_BYTE_BUFFER_SIZE]; 
    System.Buffer.BlockCopy(b, 0, chars, 0, b.Length); 

    string _message = new string(chars).Trim(); 
    string ip = _message.Substring(0, _message.IndexOf("~")); 
    _message = _message.Remove(0, _message.IndexOf("~") + 1); 
    string _flag = _message.Substring(0, _message.IndexOf("~")); 
    _message = _message.Remove(0, _message.IndexOf("~") + 1); 

    _message = _message.Replace("\0", string.Empty); 

    ip = "1.0"; 
    icount++; 
    handleData(ip, _flag, _message); 
} 

答えて

1

を受信しますプロジェクト内のコンポーネント(MulticastSenderMulticastReceiver、)を使用している場合、...

0

送信者は、メンバーシップをバインドまたは追加する必要はありません。どんなデータグラムソケットもマルチキャストアドレスに送ることができます。受信者は、マルチキャストアドレスにメンバーシップを追加する必要があります。送信者と受信者もポートに同意する必要があります(受信者はポートにバインドする必要があります)。

各例のマルチキャストオプションでは、引数が逆になっています。

ソケットはすでにカーネルからバッファリングされているため、コードをメッセージキューで複雑化する必要はありません。

関連する問題