2016-06-23 2 views
1

UDP 소켓을 사용하여 메시지를 보내고 있습니다. 유형의 처리되지 않은 예외 'System.Net.Sockets :예외를 무시하는 방법

그래서 나는

sending_socket.ReceiveTimeout = 4000; 
sending_socket.ReceiveFrom(ByteFromListener, ref receiving_end_point); 

가 지금은 (내가 기대하고있다)이 예외가 ... 난 4 초 시간 제한 예외를 설정받을 때. SocketException 사용 'System.dll을 발생

추가 정보 : 연결 시도가 연결된 파티 일정 시간 후에 제대로 응답하지 않았기 때문에 연결 호스트 내가 t를 원

응답하지 않았기 때문에, 또는 설정된 연결이 실패 실패 o이 예외를 어떻게 무시할 수 있는지 알고 있습니까?

Basicly은 내가 UDPSOCKET 4 초 동안 듣고 싶은 아무 대답이 다시 메시지를 보내려고하지 않는 경우 ... 내 코드는 (의 일부)

IPEndPoint sending_end_point = new IPEndPoint(sendto, sendPort); 
     EndPoint receiving_end_point = new IPEndPoint(IPAddress.Any, 0);   

     Socket sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     text_to_send = ("hello"); 
     byte[] send_buffer = Encoding.ASCII.GetBytes(text_to_send); 
     sending_socket.SendTo(send_buffer, sending_end_point); 
     Byte[] ByteFromListener = new byte[8000]; 
     sending_socket.ReceiveTimeout = 4000; 
     sending_socket.ReceiveFrom(ByteFromListener, ref receiving_end_point); 
     string datafromreceiver; 
     datafromreceiver = Encoding.ASCII.GetString(ByteFromListener).TrimEnd('\0'); 
     datafromreceiver = (datafromreceiver.ToString()); 
+0

https://msdn.microsoft.com/en-us/library/0yd65esw.aspx – pay

+0

감사합니다. – George

답변

6
try 
{ 
    sending_socket.ReceiveFrom(ByteFromListener, ref receiving_end_point); 
} 
catch (SocketException ex) { } 
+0

감사합니다. – George

+0

NIce * catch * :'SocketException' 만 포착되었습니다. 그것은 맞는 스타일, +1 –

1

다음 대신 검사입니다 예외적으로, sending_socket.Available (Read on MSDN) 속성을 사용하는 것이 좋습니다.

데이터를 보낸 이후 경과 한 시간을 확인하는 논리를 추가 한 다음 사용 가능이 아직 사실이 아닌 경우 다시 보내보십시오. 아래처럼 :

bool data_received = false; 
do 
{ 
    DateTime dtSent; 
    sending_socket.SendTo(send_buffer, sending_end_point); 
    dtSent = DateTime.Now; 

    while(DateTime.Now - dtSent < TimeSpan.FromSeconds(4)) 
    { 
     while(sending_socket.Available) 
     { 
      int bytes_available = sending_socket.Available; 
      // you can use bytes_available variable to create a buffer of the required size only. 
      //read data... and concatenate with previously received data, if required 
      data_received = true; 
     } 
     Thread.Sleep(100); // sleep for some time to let the data arrive 
    } 
}while(!data_received); 

위의 코드는 간단한 샘플 로직 일뿐입니다. 친절 하 게 귀하의 요구 사항에 따라 그것을 수정합니다.

이미 알고있는 사례를 처리하기 위해 예외에 의존하지 말 것을 강력히 제안합니다. 예외는 사전에 알 수없고 확인할 메커니즘이없는 경우를 처리하기위한 것입니다.

또한 SocketException은 다른 이유로 인해 발생 될 수 있습니다. 이유는 무엇이든 이유로 인해 연결이 끊어 질 수 있기 때문입니다. 이러한 시나리오에 대해서는 예외를 처리해야 코드에서 이러한 시나리오를 올바르게 처리 할 수 ​​있습니다.

+0

고마워요, 이것에 대해 살펴 보겠습니다. 아주 똑똑한 방법일까요? – George

+0

이것이 데이터 수신 여부를 확인하는 유일한 방법입니다. 예외는 매우 무거운 물체이므로 소켓에서 데이터를 사용할 수 있는지 여부 또는 파일을 읽을 수 있는지 여부와 같은 유사한 시나리오 (예 : 기기가 준비되었는지 확인하고 Google에서 읽을 수있는 권한이 있는지 확인하는 것과 같은 작업에 사용하면 안됩니다. 파일). 예외는 ... 처리 할 수 ​​있습니다. 예외, 즉 ..... 우리는이 결과/시나리오를 통제 할 수 없었습니다. 따라서 예외. 그러니 그걸로 만 처리하십시오. –

+0

또한 시나리오에서 다른 이유로 예외가 발생하면 어떻게 알 수 있습니까? 신뢰 네트워크는 LAN에서도 항상 신뢰할 수 없습니다. –

관련 문제