TCP Send는 원인 충돌 프로세스를 반환하지 않습니다
문제
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);