2014-05-14 2 views
1

TcpClient 개체를 사용하여 데이터를 보내고받습니다. 클라이언트가 연결을 잃었을 때 TcpView를 사용하여 관련 연결이 CLOSE_WAIT 상태임을 알 수 있습니다. C#에서 소켓의 상태를 볼 수 있습니까? 난 단지 서버 끝에서 소켓을 닫을 수 있도록 CLOSE_WAIT 상태를 감지하고 싶다. 일정 시간 동안 바이트를 수신하고 아무 것도 수신되지 않으면 연결을 닫을 때까지 기다릴 수 있음을 이해합니다. 방금 소켓과 스레드를 닫는 것이 좋습니다. 소켓의 상태를 C# 측에서 감지 할 수 있습니까? TcpView 프로그램이 이것을 판별 할 수 있습니다. C# 프로그램이 이것을 할 수 있습니까?소켓이 CLOSE_WAIT 상태에 있는지 감지 할 수 있습니까?

답변

0

이상적은 아니지만 socket.Available을 확인하면 SocketException이 표시됩니다. 그래도 이유를 확인해야합니다.

또한 다소 이상하지 않기 때문에 Poll() (SelectRead)으로 전화하는 것이 좋습니다. true을 반환하면 읽을 데이터가 있거나 연결이 닫힙니다. 읽을 데이터가 없다면 그것은 당신의 대답입니다.

+0

감사합니다. 내 현재의 clunky 솔루션은 단순히 클라이언트에 1 바이트를 보내고 클라이언트가 연결이 끊어진 경우 소켓 예외를 잡으려고합니다. 나는 단지 세션을 종료하기 위해 예외에 의존하기를 원하지 않는다. SelectWrite로 Poll()을 사용하면 실제로 내가하는 일의 더 나은 방법 일 수 있습니다. 그래도 소켓에 대한 tcp 상태 (established, close_wait 등)를 확인할 수 있기를 원합니다. 나는 어떻게 든 손에 소켓에 ​​해당하는 TcpConnectionInformation 개체를 얻으려고 노력하고 있지만 가능하다면 그것을 알아 내지 못했습니다. – steven

+0

SelectWrite가있는 Poll()은 연결이 close_wait 상태이면 여전히 true를 반환합니다. 클라이언트가 아직 메시지를 보내지 않았기 때문에 SelectRead를 사용할 수 없습니다. – steven

+0

나중에 TcpConnectionInformation을 살펴볼 것입니다. 당신은 상태가 더 명확 할 것임을 아는 것이 옳습니다. 'SelectRead'는 분명히 갈 길입니다. 왜냐하면 _to_ 읽기가 진행중인지 알려주니까요. 후속 조건 (더 많은 데이터를 읽으려고 시도)은 데이터 또는 닫힌 연결인지 여부를 알려줍니다. 내가 말했듯이, 이상적이지 ... –

관련 문제