2011-04-27 7 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 패킷을 서버로 보냅니다. 예

(전송 속도는 초당 수백이다) 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() 문제는 버그입니다.

는 그것은

here

4.0

는 감사의 .NET 프레임 워크에 고정되어 있습니다.

+0

을 할 수있는 다른 방법은 무엇입니까? –

+0

지금 업데이트했습니다. 죄송합니다. – firia2000

답변