문제

TCP 서버와 클라이언트가 연결된 경우 클라이언트가 더 이상 연결되지 않은시기를 결정하고 싶습니다. 나는 클라이언트에게 메시지를 보내려고 시도하여 단순히 이것을 할 수 있다고 생각하고 일단 send ()가 -1로 반환하면 소켓을 찢을 수 있습니다. 이 구현 작업은 Windows에서 찾을 수 있지만 BSD 소켓을 사용하여 Linux 에서이 작업을 수행하는 순간 서버 측 앱에서 보내기 ()로 클라이언트가 더 이상 연결되지 않으면 서버 앱이 충돌하게됩니다. -1을 반환하지도 않습니다 ... 단지 프로그램을 종료합니다.

왜 이런 일이 일어나고 있는지 설명 해주세요. 미리 감사드립니다!

도움이 되었습니까?

해결책

이것은 SIGPIPE 신호로 인해 발생합니다. 보다 send(2):

send () 함수는 다음과 같은 경우 실패해야합니다.
epipe] 소켓이 쓰기를 위해 종료되거나 소켓이 연결 모드이며 더 이상 연결되지 않습니다. 후자의 경우, 소켓이 sock_stream 또는 sock_seqpacket 유형이고 msg_noSignal 플래그가 설정되지 않은 경우 SIGPIPE 신호가 호출 스레드로 생성됩니다.

당신은 이것을 사용하여 이것을 피할 수 있습니다 MSG_NOSIGNAL 깃발 send() 전화하거나 무시함으로써 SIGPIPE 신호 signal(SIGPIPE, SIG_IGN) 프로그램의 시작 부분에. 그럼 send() 함수는 -1을 반환하고 설정합니다 errno 에게 EPIPE 이러한 상황에서.

다른 팁

SIGPIPE 신호를 무시해야합니다. 소켓에서 쓰기 오류가 발생하면 SIGPIPE를 사용한 프로세스 및 해당 신호의 기본 동작은 프로세스를 죽이는 것입니다. 당신이 일반적으로 원하는 *nix에 네트워킹 코드 작성 :

signal(SIGPIPE,SIG_IGN);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top