2013-11-01 3 views
0

리눅스에서 TCP 소켓의 상태를 어떻게 확인할 수 있습니까? 이 주제에서 많은 것을 검색했지만 실제 사용 가능한 해결책을 찾지 못했습니다. 내가 가장 많이하는 내용은 소켓에 무엇인가를 쓰고 연결이 끊어지면 실패합니다. 하지만 스트림의 내용이 바인딩되어 있고 스트림에 정크 메일을 쓰지 않는 경우 어떻게됩니까? 다른 측면에서는 netstat 소켓 상태를 확인할 수 있지만 netstat 기반 솔루션을 구현하려는 경우 매우 비쌉니다. 나는/proc/net/tcp에서 모든 레코드를 읽는 것보다 socketDescriptor를 resolv해야한다. 맞는 라인을 찾고 테스트 상태가 성립한다. 이 메소드를 주기적으로 호출해야하는 경우에는 효율적이지 않습니다. 이 문제에 대한 다른 속기 솔루션이 있습니까?tcp 연결 상태 확인

답변

0

수 없습니다. TCP 소켓에는 동적 상태가 없습니다. 이전 작업 결과 만 있습니다. TCP 연결에서 작동하지 않으면 의도적으로 상태를 변경하지 않도록 설계되었습니다. '다이얼 톤'이 없기 때문에 SNA와 같은 네트워크 아키텍처를 완전히 대체 한 근본적인 이유입니다.

0

연결이 아직 작동 중인지 확인하려면 소켓 I/O 작업을 수행해야합니다. 소켓에 쓸 수 없다면 (다른 읽기 작업을 방해하지 않는 한) 여전히 읽기 작업을 시도하고 연결 오류로 실패하는지 확인하십시오.

+0

... 독서가 네트워크 문제를 드러내지 않는다는 것을 명심하십시오. – EJP

+0

글씨체로 글을 쓰는 것도 보장 할 수는 없습니다. 소켓 연결 끊김/손실 된 것을 알 때까지, 최종 적으로 채워질 때까지 계속해서 내부 버퍼에 아웃 바운드 데이터를 받아 들일 것입니다. 그러면 연결이 결국 감지되어 쓰기가 실패 할 때까지 호출자가 추가 쓰기를 차단합니다. 독서와 똑같은. 소켓의 내부 버퍼가 비어있을 때 더 이상 읽을 데이터가 없어서 호출자를 읽기로부터 차단하지만 결국 소켓은 연결 해제를 감지하여 읽기 실패를 유발합니다. –

+0

동일하지 않습니다. 쓰기는 스택에 강제로 데이터를 보내고, ACK를 예상하고, 재시도를 보내고, 재시도 타이머와 카운터를 작동하게합니다.이 모두가 결국 장애 조건을 벗어날 수 있습니다. 독서는 단지 읽습니다. 유일한 실패 조건은 읽기 타임 아웃이며 스택에 영구적 인 내용을 트립하지 않고 응용 프로그램으로 만 이동합니다. – EJP