это мой первый вопрос, и я не являюсь носителем английского языка, поэтому извините за мой (возможно) неточный английский.
Я использую сетевой движок в реальном времени и использую метод 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 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110: 59368 2
192.168.0.1: 59368 2
192.168.0.1: 50113 1111111111111111111111111111
192.168.0.1: 59368 111111111111111111111111111 * часть * 10351036 * 192.168.0.1: 59368 2
192.168.0.1: 50113 11111111111111111111111111111
192.168.0.1: 50113 11111111111111111111111111111
111111111111111111111111111111111112
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 имеет значение null
(Добавить) Проблема ReceiveMessageFromAsync () является ошибкой.
Исправлена в .NET Framework 4.0
здесь
спасибо.