이것은 제 첫 질문이며 영어 원어민이 아니기 때문에 (어쩌면) 부정확 한 영어로 유감입니다.이 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 패킷을 서버로 보냅니다. 예
(전송 속도는 초당 수백이다) CLIENT1 (192.168.0.1:50113)는 "11,111,111,111,111,111,111,111,111,111는" CLIENT2 (192.168.0.1:59368)는 "2"를 보낸다 보낸다.
때때로 (항상은 아님) 끝점이 잘못되었습니다.
192.168.0.1:50113 11,111,111,111,111,111,111,111,111,111
192.168.0.1:50113 11,111,111,111,111,111,111,111,111,111
192.168.0.1:50113 11,111,111,111,111,111,111,111,111,111
192.168.0.1:59368 2
192.168 : 로그는 다음과 같다 .0.1 : 59368 2
192.168.0.1:50113 11111111111111111111111111111
192.168.0.1:59368 11,111,111,111,111,111,111,111,111,111 < - 잘못된 부분
192.168.0.1:59368 2
192.168.0.1:50113 11,111,111,111,111,111,111,111,111,111
192.168.0.1:50113 11,111,111,111,111,111,111,111,111,111
192.168.0.1:50113 11111111111111111111111111111
192.168.0.1:59368 2
192.168.0.1:59368 2
192.168.0.1:50113 11,111,111,111,111,111,111,111,111,111
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가 null
(추가) ReceiveMessageFromAsync() 문제는 버그입니다.
는 그것은
4.0
는 감사의 .NET 프레임 워크에 고정되어 있습니다.
을 할 수있는 다른 방법은 무엇입니까? –
지금 업데이트했습니다. 죄송합니다. – firia2000