这是ReceiveFromAsync()错误吗?

时间:2011-04-27 11:02:31

标签: c# asynchronous udp

这是我的第一个问题,我不是英语母语人士,对于我(可能)不准确的英语感到抱歉。

我正在实现实时网络引擎并使用Socket.xxxAsync()方法。

我在服务器端做了这样的UDP套接字。

m_udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
m_udpSock.Bind(new IPEndPoint(IPAddress.Any, udpPort));
SocketAsyncEventArgs udpRecvArg = new SocketAsyncEventArgs();
udpRecvLoopStart(m_udpSock, udpRecvArg);

(udpPort为客户所知。)

    private void udpRecvLoopStart(Socket udpSocket, SocketAsyncEventArgs udpRecvArg)
    {            
        udpRecvArg.AcceptSocket = udpSocket;
        byte[] udpRecvBuffer = new byte[NetworkEngineConst.MsgSizeMax];
        udpRecvArg.SetBuffer(udpRecvBuffer, 0, udpRecvBuffer.Length);
        udpRecvArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
        udpRecvArg.Completed += new EventHandler<SocketAsyncEventArgs>(udpRecvArg_Completed);

        udpRecv(udpRecvArg);
    }

    private void udpRecv(SocketAsyncEventArgs udpRecvArg)
    { 
        bool synchronous = false;
        try
        {                
            synchronous = !udpRecvArg.AcceptSocket.ReceiveFromAsync(udpRecvArg);
        }
        catch (Exception e)
        {
            OnIOError("recvUdp()\n" + e.ToString());
            return;
        }
        if (synchronous)
            udpRecvArg_Completed(this, udpRecvArg);
    }

已完成的事件处理程序是:

    void udpRecvArg_Completed(object sender, SocketAsyncEventArgs udpRecvArg)
    {
        EndPoint udpEp = udpRecvArg.RemoteEndPoint;            
        string msg = Encoding.UTF8.GetString(udpRecvArg.Buffer, 14, udpRecvArg.BytesTransferred - 14);
        Debug.WriteLine(udpEp + " " + msg);
        udpRecv(udpRecvArg);            
    }

(前14个字节是消息前缀,CRC和序列号)

两个(或更多)客户端将UDP数据包发送到服务器。 (发送速率是每秒数百)

例如,client1(192.168.0.1:50113)发送“11111111111111111111111111111”, client2(192.168.0.1:59368)发送“2”。

但有时(并非总是)端点是错误的。日志如下:

192.168.0.1:50113 11111111111111111111111111111

192.168.0.1:50113 11111111111111111111111111111

192.168.0.1:50113 11111111111111111111111111111

192.168.0.1:59368 2

192.168.0.1:59368 2

192.168.0.1:50113 11111111111111111111111111111

192.168.0.1:59368 11111111111111111111111111111 &lt; - 错误部分

192.168.0.1:59368 2

192.168.0.1:50113 11111111111111111111111111111

192.168.0.1:50113 11111111111111111111111111111

192.168.0.1:50113 11111111111111111111111111111

192.168.0.1:59368 2

192.168.0.1:50113 11111111111111111111111111111

192.168.0.1:59368 2

192.168.0.1:59368 2

我怀疑数据包错误,但数据包中没有错误(我用Wireshark确认)

这是一个错误吗?

(添加)

我试过

        m_udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        m_udpSock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.PacketInformation, true);
        m_udpSock.Bind(new IPEndPoint(IPAddress.Any, udpPort));

并用ReceiveMessageFromAsync()替换了ReceiveFromAsync()。

但SocketAsyncEventArgs.ReceiveMessageFromPacketInfo.Address为空

(添加) ReceiveMessageFromAsync()问题是一个错误。

它已在.NET framework 4.0中修复

here

谢谢。

1 个答案:

答案 0 :(得分:1)

也许尝试使用Socket.ReceiveMessageFromAsync,然后使用ReceiveMessageFromPacketInfo 获取数据包数据。

仅供参考this是另一种方法(参见答案中的编辑)

HTH