- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的第一个问题,我不是以英语为母语的人,所以很抱歉我的(可能)不准确的英语。
我正在实现实时网络引擎并使用 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 1111111111111111111111111111 <- 错误部分
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));
并将 ReceiveFromAsync() 替换为 ReceiveMessageFromAsync()。
但是 SocketAsyncEventArgs.ReceiveMessageFromPacketInfo.Address 为空
(添加)ReceiveMessageFromAsync() 问题是一个错误。
在 .NET Framework 4.0 中修复
谢谢。
最佳答案
也许尝试使用 Socket.ReceiveMessageFromAsync然后使用 ReceiveMessageFromPacketInfo 获取数据包数据.
仅供引用 this是另一种方法(请参阅答案中的编辑)
HTH
关于c# - 这是 ReceiveFromAsync() 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5802998/
是否有人有关于 UDP 的 ReceiveFromAsync 工作示例?我找不到任何示例代码。我可以找到一些 TCP 示例,但 msdn 说“ReceiveFromAsync 方法主要用于在无连接套接
我目前正在开发高性能原始套接字应用程序。 我正在使用 ReceiveFromAsync 来接收数据包。这可能听起来像是一个愚蠢的问题,但这是否是隐式线程化的?我不确定是否需要取出接收到的数据包并从处理
这是我的第一个问题,我不是以英语为母语的人,所以很抱歉我的(可能)不准确的英语。 我正在实现实时网络引擎并使用 Socket.xxxAsync() 方法。 我像这样在服务器端创建了一个 UDP 套接字
我是一名优秀的程序员,十分优秀!