2011-08-04 8 views
4

Linux TCP 소켓을 통해 통신하는 네트워크 응용 프로그램을 작성합니다. 최근에 내 시스템 콜이 내 응용 프로그램을 망가 뜨리는 것을 보았습니다. 두 동료가 모두 작동하면 잘 작동합니다 (지금 충돌 복구를 테스트 중입니다). 그러나 한 피어가 다운되면 두 번째 코드가 실행되면서 충돌합니다.Linux TCP 소켓 충돌

fprintf(stderr, "out_tcp %d\n", out_tcp); 
    if(send(out_tcp, &packet, sizeof(packet), 0) == -1) 
     fprintf(stderr, "send TCP error"); 
    fprintf(stderr, "after send"); 

소켓은 이미 준비 연결 및 제 2 피어가 내려 가기 전에 여러 번 실행 된 있습니다. 이 코드가 -1 값을 반환 할 것으로 예상했지만, 출력에서만 "out_tcp 11"을 생성 한 다음 응용 프로그램을 종료합니다. 오류 메시지가 없으며 보내지는 반환 값이 없습니다. 내가 Valgrind에서 실행하면 응용 프로그램이 정상적으로 종료된다고 표시됩니다. 오류/경고 메시지는 표시되지 않습니다.

누구든지 디버깅 방법을 알고 있습니까? 사용할 도구? 나는 정보가 없으므로 이것에 상당히 매달렸다. 사전 Harnen

+1

시그널링을 사용하는 데 도움이 희망? 'gdb'로 검사 해 봤나? –

+1

Valgrind? 그것은 메모리 누수가 아니므로'gdb'에서 실행하십시오. 'SIG_PIPE' 때문에 종료 할 수 있습니다. –

+2

[SIGPIPE를 방지하거나 서버가 종료되지 않도록하는 방법] 복제본을 만들 수 있습니까? (http://stackoverflow.com/questions/6821469/how-to-prevent-sigpipe-or-prevent-the-server-from-ending) –

답변

0

에서

감사는 오류 조건에 대한 (미세 설명서를 읽어) RTFM 위해 노력했다? 신호를 포착하거나 무시합니까? errno 전역 변수는 어떻습니까?

man send 

은 또한 TCP, 따라서 당신이 어떤 특별한 플래그를 필요하지 않은 경우()(), 쓰기, 읽기와 같은 일반적인 스트리밍 액세스 명령을 사용하는 것이 좋습니다 스트리밍 프로토콜입니다.

+0

나는 해냈다. 보내기가 돌아 오지 않고 응용 프로그램이 종료되면 아무 것도하지 않는 것이 좋습니다. (errno 확인) ... – harnen

1

해결 : 송신 기능에 사용 MSG_EOR, MSG_NOSIGNALflag을 다음과 같이

if(send(out_tcp, &packet, sizeof(packet), **MSG_EOR|MSG_NOSIGNAL**) == -1) 

그것이