這是我的第一個問題,我不是英語母語的人,所以很抱歉我的(也許)不準確的英語。這是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
謝謝。
的另一種方式是什麼'udpRecv'? – 2011-04-27 11:07:32
我已經更新了。抱歉。 – firia2000 2011-04-27 11:14:23