2013-04-22 3 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 주소는 다음과 같습니다 : I는 멀티 캐스트 클라이언트를 설정합니다. 다음과 같이

수신기는 같습니다

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); 
    } 

비동기 콜백을 계기로 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); 
     } 
    } 

내가 윈도우 7 및 .NET을 실행하고 4

사람이 코드에 문제를 참조하거나 .NET의 문제를 알고 있나요 또는 7을 획득하면 그와 같은 행동을하게됩니다.

receivestring를 들어

답변

0

는 Encoding.Unicode.GetString 사용 (receiveBytes, 0, receiveBytes.Count()) 대신 ASCII

관련 문제