0

udp マルチキャスト レシーバーがパケットを 2 回受信することがあります。マルチキャスト クライアントを次のようにセットアップします。

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.xxx アドレスです。

受信機は次のようになります。

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

Windows 7 と .Net 4 を実行しています。

このような動作を引き起こすコードの問題、または .NET または win 7 の問題を知っている人はいますか?

4

1 に答える 1

0

receivestring には、Encoding.Unicode.GetString(receiveBytes, 0, receiveBytes.Count()) を使用します。

ASCIIの代わりに

于 2013-05-26T06:15:06.927 に答える