2013-01-19 5 views
2

TCP 연결을 기다리는 중 pselect이 실행 중입니다. 그 pselect 자체 스레드에서 실행되고, 따라서 나는 그들을 실행하는 무리가 있습니다.TCP 소켓이 닫히지 않음

나는 pselect에 대한 제한 시간을 설정했지만 sockstat을 실행하면 절대로 닫히지 않는 연결이있는 것 같습니다. 99 %가 그 중 하나입니다. 연결을 모두 만들고있는 클라이언트를 닫을 때, 나는 타임 아웃 기간 후에 소켓을 닫을 수 있다고 생각할 것입니다. 반환 값이 0인지 확인하기 위해 중단 점을 넣었지만 결코 발생하지 않습니다. 사이비에서

이 내가

if((ret == pselect(..., timeout, NULL) <0){ 
//check errors 
} else if (ret == 0) 
{ 
//close connection for timing out 
//I never land here, even though I can close the client side (thus presumably closing the connection) 
} 

다른 내가 그건 내 문제가있는 경우 디버깅하기 위해 할 수있는 무엇인가? sockstat에서 볼 수는 있지만 정확히 어떤 소켓 fd가 열려 있는지 알려주는 것은 어렵습니다.

답변

2

다른 쪽 끝에서 닫힌 소켓이 읽기 및 쓰기 가능하기 때문에 스레드는 (포함되지 않음) else 케이스에서 돌고 있습니다. 타임 아웃의 경우 타임 아웃 기간 동안 다른 쪽을 열어두기를 원할 것입니다.

내가 볼
+0

... 나는 try..I했던이 세트의 FD의의를 확인하기 위해 다른 다른 블록을 제공하지만 것이다 (당신이있어이 사건은 POLLHUPpoll()의 용어입니다) 나는 단지 다른 것을 잡았다 고 생각하지 않는다. – Derek

+0

@Derek : 원격지에 닫힌 소켓이있는 것을 볼 수있는 것보다 다른 절에서 catch-all'else'가 필요 없다. 읽기 세트와'recv'는'ECONNRESET'을 리턴 할 것입니다. –

+0

피어가 정상적으로 연결 해제되면 0을 반환합니다. – EJP