2009-09-26 5 views
2

C로 작성된 TCP 서버와 클라이언트가있어 영원히 열려야하는 연결을 엽니 다. 첫번째 send에서, errno는 0을 반환한다. 후속 송신시에는 조작이 시간 초과됨을 나타내는 errno 60이 표시됩니다. 패킷은 여전히 ​​서버에 의해 수신되지만 아무것도 잘못된 것으로 보입니다. errno가 설정되는 원인은 무엇일까요? 올바르게 작동하는 것 같으므로이 오류를 무시하는 것이 가장 좋습니다.TCP 작업 시간 초과

+0

실제로 send()는 -1을 반환합니까? – Artelius

답변

3

임의의 추측 : errno 일 때만 설정됩니다. 함수가 실패하지 않으면 errno은있는 그대로 유지됩니다. 그것은 다음은 잘못하지 세트 0에 입니다 대신

send(…); 
if (errno) { 
    perror("send"); 
} 

, 당신이 전송 결과 확인해야합니다

ssize_t res = send(…); 
if (-1 == res) { 
    perror("send") 
} 

는 다음과 같은 프로그램이 확인할 수 있습니다

#include <stdio.h> 
#include <unistd.h> 

int main() { 
    char buf[16]; 
    ssize_t res; 

    read(999, buf, sizeof(buf)); 
    perror("read"); 

    write(1, "hello world\n", 12); 
    perror("write"); 
} 

출력 :

read: Bad file descriptor 
hello world 
write: Bad file descriptor 

(참고 : STDOUT은 fd 1이라고 가정)

0

나는 send()의 반환 값이 아닌 errno 변수 만 테스트한다고 생각합니다.

함수 리턴 값이 함수에 의해 errno 변수가 설정되었음을 표시 한 후에 errno 변수를 검사해야합니다. 함수가 errno가 설정되었다고보고하지 않으면 errno 변수는 의미있는 값을 보유하지 않습니다.

2

다른 사람들이 언급 한 것처럼, errno 값을 방탄하는 방식으로 해석하려면 Unix 시스템 기능 ... 모두를 반환해야합니다! 나는 헨리 스펜서 (Henry Spencer)의 표준 지침 6 항목을 참조한다. The Ten Commandments for C programmers :

어려움이있을 때 오류 코드를 반환하도록 광고 기능을 알리는 경우, 해당 코드를 확인해야한다. 너의 타자를 치는 손가락에 고통을 일으킨다. 네가 "나에게 일어날 수 없다"고 생각한다면, 신은 반드시 네 오만함을 위해 네를 벌할 것이다.