2011-01-22 3 views
3

리눅스와 아이폰의 소켓 레벨에서 작성한 크로스 플랫폼 코드가 있습니다. 비 블로킹 소켓을 열고 서버에 연결합니다. 모든 것은 클라이언트/서버 중 하나가 recv 나 send 호출 동안 다른 프로세스에서 SIGPIPE를 통해 exec를 중단 할 때를 제외하고는 훌륭하게 작동합니다.TCP 연결 유실을 감지하는 방법은 무엇입니까?

그건 의미가 있습니다. 리눅스에서는 SIGPIPE를 발생시키지 않기 위해 OS의 lib에 플래그를 사용할 수 있습니다. 그런 다음 오류를 직접 감지하고 깔끔하게 처리 할 수 ​​있습니다. 그게 잘 작동

그러나 아이폰 OS (그리고 아마도 내가 나중에 신경 쓰는 osx)에는 SIGPIPE를 던지지 말라는 플래그가 없습니다. 나는 신호 (SIGPIPE, IGN)를 할 수있다; 그것은 보통 그것을 멈추는 것처럼 보인다. 그러나 아직도 때때로 나는 그것을 얻는다? (이 신호 처리 설정으로 인해 - 앱 시작시에만 할 수 있으며 대신 앱이 활성화 될 때마다해야 할 수 있습니다.)

이 모든 것이 나를 느끼게합니다. 연결 끊김을 잘못 잡는 중입니다. select() 또는 friends를 사용하여 연결 해제가 발생했는지 감지해야합니까? 구체적으로 어떻게 할 수 있습니까?

답변

1

정말 그 중 하나만 검색하면됩니다 (예 : this page). 간단히 말해 이미 시도한 것 외에 SO_NOPIPE 소켓 옵션을 사용해보십시오.

관련 문제