2010-01-25 2 views
4

잘 .. 대용량 소켓을 처리하기 위해 epoll + multithread의 일반적인 모델을 사용합니다. 즉, epollWorkThread라는 스레드에서 epoll_wait를 사용하여 I/O를 처리합니다. 소켓. EPOLLIN 이벤트가있는 동안 recv()가 작업을 수행하며 즉각 반환 할 수 있도록 noblocking 모드를 사용합니다. recv()는 실제로 while (true) 루프에 있습니다. 모든 것이 초기 시간 (어쩌면 몇 시간 또는 어쩌면 몇 분 또는 운이 좋으면)이라도 정보를받을 수 있습니다. 그러나 얼마 후 recv()는 errno = 107 (ENOTCONN)과 함께 -1을 반환한다고 주장합니다. 전송 장치의 다른 피어는 AS3에 작성되어 소켓이 연결되어 있는지 확인합니다. 그래서 나는 recv() 동작에 혼란스러워합니다. 미리 감사 드리며 모든 의견을 환영합니다!recv()와 errno = 107 : (전송 끝점 연결)

+0

아무 일도 일어나지 않아 답변이 없지만 네트워크 모니터를 사용하여 자세한 정보를 얻으십시오. tcpdump 나 wireshark를 사용합니다. 더 편리합니다. 코드가 손상되어이 문제 (valgrind)가 발생했는지 여부를 확인하는 것을 잊지 마십시오. – stefaanv

+0

정보를 보내 주셔서 감사합니다. tcpdump를 시도했지만 패킷을 캡처하는 방법을 알지 못했습니다. "tcpdump -i eth0 '포트 myportnum'"시도했지만 anythin 캡처하지 않습니다 ... – iBacchus

+0

eth0 확실합니까? "ip addr"로 확인하십시오. 당신은 뿌리로 그것을 시도 했습니까? 어쩌면 너는 적당한 허가가 없을지도 모른다. wireshark로 볼 수 있도록 -s0 및 -wtrace.cap도 추가했지만 매개 변수는 괜찮습니다. – stefaanv

답변

3

Errno 107은 소켓이 이 아니고이 연결됨을 의미합니다. 이 문제가 발생할 수있는 몇 가지 이유가 있습니다. 당신이 옳다고 가정하고 연결의 양쪽에서 소켓이 여전히 열려 있다고 주장하면 중간 라우터/스위치가 시간 초과로 인해 연결을 끊을 수 있습니다. 이러한 일이 발생하지 않도록하는 가장 안전한 방법은 주기적으로 '건강'또는 '연결 유지'메시지를 보내는 것입니다. (따라서 중간 라우터/스위치는 연결을 거실로 허용합니다.) =