2017-12-10 3 views
1

내 블로킹 소켓에 타임 아웃을 설정 한 .. RECV()가 다음 0을 반환하는 경우(recv() == 0)은 연결이 끊어 졌거나 타임 아웃되었음을 의미합니까? (소켓, 리눅스 & 윈도우) 나는이 링크 연결이 끊어 또는 시간 초과 읽기 말할 수있는 방법을

DWORD to = 1200; 
if (setsockopt (soc, SOL_SOCKET, SO_RCVTIMEO, (char *)&to, sizeof(to))) { 
    ... 
} 

? t/o 내가 더 읽고 싶으면, 다른 행동을 취하고 싶다. 나는 내가 t/o를 제거 할 수 있다는 것을 알았습니다. 그리고 나서 그것이 discon이라는 것을 알았을 것이지만, 또한 읽기 과정이 어떻게 진행되고 있는지를 정기적으로 모니터해야합니다.

도움을 주시면 감사하겠습니다. 건배 - 리치

답변

3

man 페이지의 SO_RCVTIMEO 섹션에서 socket에 대한 :

recv에 대한 매뉴얼 페이지에서

:

These calls return the number of bytes received, or -1 if an error 
occurred. In the event of an error, errno is set to indicate the 
error. 

When a stream socket peer has performed an orderly shutdown, the 
return value will be 0 (the traditional "end-of-file" return). 

Datagram sockets in various domains (e.g., the UNIX and Internet 
domains) permit zero-length datagrams. When such a datagram is 
received, the return value is 0. 

The value 0 may also be returned if the requested number of bytes to 
receive from a stream socket was 0. 

recv에 대한 호출이 차단에 0를 반환하거나, 길이가 0 데이터 그램이 수신되거나 요청 된 바이트 수가 0 인 경우

recv을 호출하면 시간 초과를 포함하여 오류가 발생하면 -1이 반환됩니다. 시간 초과와 다른 오류를 구분하려면 errno을 검사해야합니다.

관련 문제