2011-01-11 5 views
1

다른 컴퓨터의 C#, 서버 및 클라이언트 프로그램에서 c/s 모드로 comunication 프로그램을 작성합니다. 오늘 클라이언트 progarm 서버 progarm에 연결 한 후, 나는 네트워크 어댑터에서 케이블을 꺼냈다. (이 후, 클라이언트와 서버 프로그램은 아무 것도하지 않았다), 이상한 일이 일어났다. 서버 프로그램의 소켓이 여전히 연결 상태를 유지하고 있음을 알았습니다. 내가 네트워크 정보를 검색하고 다음과 같이 정보를 얻기 위해 명령 "에서 netstat -a -n"을 사용 설립네트워크 케이블을 네트워크 어댑터에서 분리 할 때 소켓 상태를 얻는 방법

TCP 192.168.1.2:3645 192.168.1.3:1863

192.168.1.2 (서버 IP 주소) 192.168.1.3 (클라이언트 IP 주소)

이유를 아는 사람이 있습니까? 이 문제를 해결하는 방법. 클라이언트 컴퓨터의 네트워크 케이블이 빠져 나왔을 때 어떻게 서버 프로그램이 이벤트를 수신하고 소켓을 닫을 수 있는지 알고 싶습니다.

제발 나에게 몇 가지 조언이나 솔루션을 제공합니다.

감사

+0

socket.Connected (또는 IsConnected, 잊어 버렸습니다.)는 마지막 명령 이후의 소켓 상태 만 알려주는 것을 기억하십시오. 그래서 마지막 명령이 성공했다면, 그것은 사실로 돌아올 것입니다. 그런 다음 케이블을 당겨 내면 케이블을 사용하려고 시도 할 때까지 케이블이 계속 true입니다. – NibblyPig

답변

4

TCP keepalive를 사용하여 해결할 수 있다고 생각합니다. refrence http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

연결 후 소켓 keepalive 속성을 설정하십시오. msdn은이 스위치의 기본 상태가 꺼져 있다고 말하며, keepalive를 on으로 설정하면 소켓이 네트워크 상태를 자동으로 확인하고 첫 번째 확인 시간은 소켓에서 마지막으로 작업 한 후 2 시간입니다. 그러나 시간은 짧을 수 있습니다. 첫 번째 검사가 끝나면 소켓이 서블 타임을 갖습니다. 연결이 끊어 지거나 사망 한 경우 소켓에서 예외가 발생합니다.

C 번호 자료 : 내가 체크 한

uint dummy = 0; 
    byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3]; 
    //set keepalive on 
    BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0); 
    //interval time between last operation on socket and first checking. example:5000ms=5s 
    BitConverter.GetBytes((uint)5000).CopyTo(inOptionValues, Marshal.SizeOf(dummy)); 
    //after first checking, socket will check serval times by 1000ms. 
    BitConverter.GetBytes((uint)1000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2); 

    Socket socket = __Client.Client; 
    socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null); 

. 괜찮아.

+0

이것은 매력처럼 작동하고 쉽게 100 upvotes받을 자격이. – Toxantron

-1

임 조금 확실하지만 당신은 당신이 케이블을 당겨 후 소켓에서 데이터를 읽으려고한다면 당신은 할 수 없습니다 ..

+0

고마워요. 하지만 나는 예외를 잡기를 원합니다. 프로그램 사업은 다음과 같습니다. 서버가 클라이언트에게 명령을 보내고 명령을 받고 실행 한 다음 결과를 돌려 보냅니다. 서버 수신 프로그램은 비동기식이므로 케이블을 뽑을 때 서버가 데이터를 수신 할 수 없습니다. – user571102

+0

일부 코드가 없으면 .. 당신을 도울 수는 없지만 데이터를 듣고 있어야하며 케이블을 뽑을 때 가야합니다 ... – Peter

+0

소켓 읽기 제한 시간을 설정하지 않으면 시간 초과가 만료되었다는 사실 만 알려주면됩니다. 그렇지 않은 이유. – EJP

2

는 더 이상 연결하지 않는 것이 당신에게 말할 것이다. 연결 상태를 확인하는 신뢰할 수있는 유일한 방법은 다음과 같이 데이터를 전선으로 전송하는 것입니다. 보내기/받기 중에 연결 오류를 처리하고, 유휴 상태에서 연결 상태를 원할 경우 ping의 연결 상태를 선택적으로 주기적으로 확인합니다 (선택 사항). 미문.

관련 문제