2010-05-20 11 views
5

제 리눅스 어플리케이션이 비 블로킹 TCP connect syscall을 수행하고 있고 epoll_wait을 사용하여 세 방향 핸드 셰이크 완료를 감지합니다. 가끔 epoll_wait은 동일한 소켓 설명자에 대해 POLLOUT & POLLERR 이벤트가 설정된 상태로 반환됩니다.nonblocking tcp와 epoll을 연결하십시오.

TCP 수준에서 무슨 일이 일어나는지 알고 싶습니다. 나는 그것을 요구에 따라 재현 할 수 없다. 내 생각 엔 SYN + ACK/ACK/FIN 시퀀스가 ​​있었지만 다시 재생할 수 없다는 내 이벤트 루프 내부의 epoll_wait 두 번의 호출 사이에 그렇게 생각합니다.

답변

4

연결이 실패한 경우 (예 : "연결 시간 초과"(비 차단 연결을 수행하는 소켓의 경우) 성공적인 연결과 실패한 연결에 대해 연결 작업이 완료되면 POLLOUT이 설정됩니다). POLLOUT가 소켓에 설정된다

, 접속이 성공했는지 안했는지를 확인하기 위해 getsockopt(sock, SOL_SOCKET, SO_ERROR, ...)를 사용합니다 (연결이 실패한 이유 SO_ERROR 소켓 옵션 달리이 경우 0이며, 표시).

2

다음은 non-blocking tcp connect()에 대한 유용한 정보입니다.

소켓 오류가 감지되면 (연결 종료/거부/시간 초과) epoll은 POLLERR로 등록 된 관심 이벤트 POLLIN/POLLOUT을 반환합니다. 따라서 POLLOUT을 등록한 경우 epoll_wait()는 POLLOUT | POLLERR을, POLLIN | POLLOUT을 등록한 경우 POLLIN | POLLOUT | POLLERR을 리턴합니다.

단지 epoll이 POLLIN을 반환한다고해서 recv()가 non-blocking connect() 호출에서 오류를 반환하기 때문에 읽을 수있는 데이터가 있다는 것을 의미하지는 않습니다. 나는 epoll이 POLLERR로 등록 된 모든 이벤트를 반환하여 프로그램이 send()/recv()/etc ..를 호출하는지 확인하고 소켓 오류를 얻는다. 일부 프로그램은 POLLERR/POLLHUP을 확인하지 않고 다음 send()/recv() 호출시 소켓 오류 만 catch합니다.

관련 문제