2012-10-16 8 views
0

데이터 그램을 수집하려고하는 간단한 UDP 수신기가 있습니다. 내 데이터 그램은 두 가지 데이터 형식 중 하나 일 수 있습니다. 첫 번째 데이터 형식에서는 예상대로 프로그램에서 데이터를 받고 있습니다. 두 번째로, UDP 데이터가 Wireshark를 통해 네트워크 인터페이스로 전달되고 있음을 확인할 수 있음에도 불구하고 내 프로그램에서 데이터가 수신되었다는 표시는 전혀 없습니다. 아마도 윈도우즈가 거절 한 잘못된 UDP 패킷일지도 모른다. 그러나 Wireshark는 그것들을 UDP로 표시하고있다. 내 코드는 다음과 같습니다 :.NET UDP 데이터 수신

static void Main(string[] args) 
    { 
     Thread thdUdpServer = new Thread(new ThreadStart(serverThread)); 
     thdUdpServer.Start(); 
    } 

    static void serverThread() 
    { 

     Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     socket.Bind(new IPEndPoint(new IPAddress(0), 2000)); 

     while (true) 
     { 
      byte[] responseData = new byte[128]; 
      socket.Receive(responseData); 
      string returnData = Encoding.ASCII.GetString(responseData); 
      Console.WriteLine(DateTime.Now + " " + returnData); 

     } 

누락 된 패킷 (ASCII로 변환)과 같이 보일 모두 29 바이트의 데이터 그램이다.

#01RdFFFF...?...... ........F 

왜 Wireshark가 자신의 존재를 나타내지 만 .NET에서는 보이지 않는 것일까 요?

답변

2

바이트에 인쇄 할 수없는 ASCII 문자가 포함되어 있으면 콘솔에 표시되지 않을 수 있습니다.

+0

설명을 위해 DateTime.Now를 반환 된 데이터로 인쇄하려고했지만 여전히 아무 것도 볼 수 없습니다. – kittyhawk

+0

29 바이트 데이터 그램에는 무엇이 들어 있습니까? 처음 몇 바이트를 게시 할 수 있습니까? – HyperDev

+0

원래 게시물에 데이터 그램의 예를 추가했습니다. – kittyhawk

0

코드에 누락 된 것이 있습니다. ReceiveFrom을 호출 할 때 소켓 예외가 발생해야합니다 (적어도 MSDN에 따르면 코드를 시도하지 않았습니다.)

소켓을 수신 대기하려는 주소 : 포트에 바인딩해야합니다 (0.0.0.0 모든 로컬 주소에서 청취 할 주소로) :

ReceiveFrom의 EndPoint는 서버의 수신 대기 포트가 아닙니다. 패킷을 수신하려는 주소입니다. 모든 호스트에서 수신하려면 0.0.0.0:0의 엔드 포인트를 사용할 수 있습니다.

메서드에서 돌아 오면 끝점은 패킷 (클라이언트)을 보낸 호스트의 주소로 채워집니다.

클라이언트 끝점을 염려하지 않으면 ReceiveFrom 대신 Receive를 사용할 수 있습니다. 클라이언트가 192.168.1.100:2000에서 패킷을 보내지 않을 가능성이 높습니다. 따라서 수신하지 못하는 것입니다. ReceiveFrom을 호출 할 때 예외가 발생하지 않는 이유를 생각했습니다.

또한 :

new IPEndPoint(IPAddress.Parse("192.168.1.100"), Convert.ToInt32(2000)); 

2000

이미 int이며 : 에 Convert.ToInt32를 호출 할 필요가 없다.

+0

별도의 스레드에서 실행 중이므로 예외 상황이 발생할 수 있다고 생각합니다. 코드를 실행해야합니다 ... –

+0

정확합니다. 내가 왜 bind 문을 나갔는지 모르겠다. 메소드를 Receive로 변경했습니다. 그러나, 나는 Wireshark에서 그들의 존재에도 불구하고 여전히 이들 클라이언트로부터 UDP 패킷을 보지 못한다. – kittyhawk

+0

내가 생각할 수있는 유일한 점은 올바른 포트 또는 올바른 인터페이스로 전송되지 않는다는 것입니다. 0.0.0.0 또는 특정 IP 주소에 바인딩 했습니까? –

관련 문제