2011-04-27 37 views
3

這是我的第一個問題,我不是英語母語的人,所以很抱歉我的(也許)不準確的英語。這是ReceiveFromAsync()錯誤?

我正在實現實時網絡引擎並使用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數據包到服務器。 (發送速率爲每秒幾百)

例如,客戶端1(192.168.0.1:50113)發送 「11111111111111111111111111111」, 客戶端2(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 < - 錯誤部分

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()的問題是一個錯誤。

它被固定在框架4.0

here

謝謝。

+0

的另一種方式是什麼'udpRecv'? – 2011-04-27 11:07:32

+0

我已經更新了。抱歉。 – firia2000 2011-04-27 11:14:23

回答