2012-04-23 4 views
1

소켓 서버를 쓰고 있는데 빈 소켓 버퍼를받은 경우 socketexception이 발생합니다. 수신 호출에서 어떻게 빈 버퍼를 감지하고 처리하고 소켓이 닫히기 전에 -1 응답을 클라이언트에 다시 보낼 수 있습니까?빈 소켓 버퍼를 처리하는 방법

코드 :

try 
{ 
    byte[] byteBuffer = new Byte[1024]; 
    int size = m_clientSocket.Receive(byteBuffer); 
    if (size > 0) 
    { 
     ParseReceiveBuffer(byteBuffer, size); 
    } 
    else 
    { 
     m_clientSocket.Send(BitConverter.GetBytes(-1)); 
    } 
} 
catch (SocketException ex) 
{ 
    if (ex.SocketErrorCode == SocketError.WouldBlock || 
     ex.SocketErrorCode == SocketError.IOPending || 
     ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable) 
    { 
     // socket buffer is probably empty, wait and try again 
     Thread.Sleep(1000); 
    } 
    // connection was unexpectively closed 
} 
+0

무슨 뜻인지 확실하지 않습니다. 어쨌든 다른 쪽 끝이 소켓을 종료했을 때'Receive'가 0을 리턴 할 것이라고 생각합니다. 정확히 "* 빈 소켓 버퍼를받은 경우"는 무엇을 의미합니까? –

답변

0

적절한 사용에 DataAvailable 절을 사용. 나는 이러한 모든 규칙을 수행하기위한 완전한 클래스 및 도우미 메서드를 작성하는 것이 좋습니다. 리스너가 명령 행 실행을 기다릴 것이므로 thread.sleep (1000)은 필요하지 않습니다. 또 다른 접근법은 서버 및 클라이언트 역할을 쉽게 시뮬레이션 할 수있는 개발 된 소켓 라이브러리를 사용하는 것입니다. 사용자는 자신의 프로토콜을 사용자 정의하고 개발할 수있는 supersocket을 알고 있습니다.

1

TCP 레이어로 작업한다고 가정합니다.

Send 및 Receive와 같은 소켓 기능은 실제로 네트워크를 통해 데이터를 보내거나 수신하지 않습니다. 이들은 OS 소켓 레이어와 통신하여 네트워킹 레이어에서 데이터를 푸시하거나 팝합니다. 이 때문에 응용 프로그램 메서드 보내기에서 실행하면 대기열 데이터가 OS 네트워킹 계층으로 보내집니다. 해당 운영체제가 실제로 그것을 전송하고 몇 가지 문제가 발생할 수 있습니다. 그러면 오류를 저장하고 응용 프로그램에서 특정 소켓 메소드 호출을 바로 그 위에 던질 것입니다.

이전 호출이 실패했거나 이전 호출과 현재 호출 네트워크 사이에 오류 (예 : 연결 끊김)가있을 때만 다음 호출시에만 SocketException을 수신하는 이유입니다.

예외가 수신되면 항상 아무 것도받지 않습니다 (0 바이트). 연결이 끊어지기 때문에 (대부분의 (99 %) 사례에서) 예외적으로 아무것도 보낼 수 없습니다.

클라이언트도 예외가 발생하며 연결에 대한 오류 메시지가 표시됩니다.

관련 문제