Dan Bernstein을 인용 :
상황을 : 당신은 비 블로킹 소켓을 설정하고 -1 반환/EINPROGRESS -1/EWOULDBLOCK이) (A 연결을한다. 쓰기 가능하도록 소켓을 선택()합니다. 이것은 연결이 성공 또는 실패하는 즉시 반환됩니다. (예외 : 일부 이전 버전의 Ultrix에서는 select()가 75 초의 시간 초과 전에 실패를 감지하지 못합니다.)
질문 : select()가 쓰기 기능을 반환 한 후에 무엇을합니까? 연결이 실패 했습니까? 그렇다면 어떻게 실패 했습니까?
연결이 실패하면 소켓의 so_error라는 부분에 이유가 숨겨집니다. 현대 시스템은
그는 getsockopt(,,SO_ERROR,,)
오래된 시스템에서 작동하는 방법과 얻는하지 않는 현대의 발명이 사실을 논의하기 위해 계속 ... 당신이 getsockopt 함수 (,, SO_ERROR ,,)와 SO_ERROR를 보자 그러한 시스템의 오류 코드. 그러나 지난 15 년 동안 유닉스/리눅스 시스템을 프로그래밍하고 있다면 걱정할 필요가 없을 것입니다.
connect
에 대한 Linux 매뉴얼 페이지는 SO_ERROR
과 동일한 사용법을 설명합니다.
소켓에서 비동기 작업을 수행하는 경우 일 수 있습니다.은 SO_ERROR
을 사용해야합니다. 다른 경우에는 errno
을 사용하십시오. 유닉스 네트워크 프로그래밍 인용
SO_ERROR에 대한 요점은 다른 시스템 호출 (예 :'select()'도 호출 한 후에도 소켓 데이터에 안전하게 빠져 나갔다는 것인데,'errno'도 설정할 수 있습니다. – EJP