2013-04-22 155 views
0

我偶爾看到一個數據包被我的udp多播接收器接收兩次。我設置多播客戶端如下:.NET UDP多播接收

private static void setupUdpMulticastClient() 
    { 
     //IPEndPoint ipRXEnd = new IPEndPoint(IPAddress.Any,multicastPort); 
     IPEndPoint ipRXEnd = new IPEndPoint(IPAddress.Parse(emulatorIpaddr), multicastPort); 
     udpMulticastClient = new UdpClient(); 
     udpMulticastClient.Client.ExclusiveAddressUse = false; 
     udpMulticastClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
     udpMulticastClient.Client.Bind(ipRXEnd); 
    } 

emulatorIpaddr是一個192.x.x.x地址。

接收器看起來如下:

public static void MulticastSetBeginReceive() 
    { 
     //IPAddress ipSSDP = IPAddress.Parse(multicastIP); 
     IPAddress ipSSDP = IPAddress.Parse(emulatorIpaddr); 
     IPEndPoint ipRXEnd = new IPEndPoint(ipSSDP, multicastPort); 
     UdpState udpListener = new UdpState(); 
     udpListener.e = ipRXEnd; 

     if (udpMulticastClient == null) 
     { setupUdpMulticastClient();} 

     udpListener.u = udpMulticastClient; 
     udpMulticastClient.BeginReceive(new AsyncCallback(MulticastReceiveCallback), udpListener); 
    } 

這似乎觸發異步回調上occassion 2倍。爲了完整起見, 這裏是回調代碼:

public static void MulticastReceiveCallback(IAsyncResult ar) 
    { 
     try 
     { 
      UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u; 
      IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e; 

      if (u.Client != null) 
      { 
       Byte[] receiveBytes = u.EndReceive(ar, ref e); 
       string receiveString = Encoding.ASCII.GetString(receiveBytes); 
       string from = e.ToString(); 
       string to = ((UdpState)(ar.AsyncState)).e.ToString(); 
       msgReceiver(DateTime.Now.ToLocalTime(), from, to, receiveString); 
      } 
      if (running) 
       MulticastSetBeginReceive(); 
     } 
     catch (Exception ex) 
     { 
      log.Debug(ex.Message); 
      log.Debug(ex.StackTrace); 
     } 
    } 

我運行Windows 7和.Net 4

有誰看到代碼中的問題,或者知道使用.NET的一個問題或贏得7分,這將導致這種行爲。

回答

0

對於receivestring,使用 Encoding.Unicode.GetString(receiveBytes,0,receiveBytes.Count())

代替ASCII