[C#] TCP/IP 서버에서 트래픽 분리 테스트

이것은 TCP/IP 서버가 클라이언트와 통신할 때 클라이언트와의 연결이 끊겼을 때의 처리 요약이다.
연결 해제는 다음과 같은 경우입니다.
  • 클라이언트 회선 차단
  • 클라이언트 강제 종료
  • 케이블이 빠지는 등 통신 경로가 끊어진다
  • 클라이언트 연결 끊기


    고객이 shutdown를 실행하고 회선을 끊을 때 서버의 네트워크 Stream.읽기 () 수신 길이가 0인 통신을 받고 종료합니다.
    normal_end
        int readsize = stream.Read( buf, 0, buf.Length );
        if( readsize == 0 )
        {
            // クライアントが切断したときの処理
        }
    

    클라이언트가 강제 종료됨


    클라이언트가 WSACleanup 회선을 실행하거나 ExitProcess 회선을 닫을 때 서버의 네트워크 Stream.Read() 투구는 예외적으로 종료됩니다.
    forced_end
        try
        {
            int readsize = stream.Read( buf, 0, buf.Length );
            // クライアントからの受信処理
        }
        catch( Exception e )
        {
            // クライアントが切断したときの処理
        }
    

    케이블이 빠지는 등 통신 경로가 끊기다


    보통 반응이 없다.
    Keep-alive를 미리 설정하면 설정 조건이 될 때 강제 종료 때와 같이 네트워크 스트림이 됩니다.Read() 투구는 예외적으로 종료됩니다.
    keep-alive란 연결된 상대방에게 정기적으로 투사 응답이 있는지 확인하고 응답이 없으면 선로에 이상이 생기는 방법을 측정하는 것이다.
    프로브의 ON/OFF, 고객과의 통신에서 탐지 발송까지의 대기 시간, 탐지 발송의 간격을 설정합니다.
    keep-alive_setting
        var clientSocket = listenerSocket.Accept();
        // keep-aliveをenableに設定
        clientSocket.SetSocketOption( SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true );
    
        // keep-aliveのパラメータ Cで言うところの、unsigned int が3つです。
        byte[] tcp_keepalive = new byte[12];
        BitConverter.GetBytes( (Int32)1 ).CopyTo( tcp_keepalive, 0 );//onoffスイッチ.
        BitConverter.GetBytes( (Int32)2000 ).CopyTo( tcp_keepalive, 4 );//wait time.(ms)
        BitConverter.GetBytes( (Int32)1000 ).CopyTo( tcp_keepalive, 8 );//interval.(ms)
        // keep-aliveのパラメータ設定
        clientSocket.IOControl( IOControlCode.KeepAliveValues, tcp_keepalive, null );
    
    대기 시간과 간격은 밀리초로 계산됩니다.
    이 예에서 스위치는 ON, 대기 시간 2초, 간격 1초입니다.Windows에서 10회 연속 탐지 응답이 없으면 예외가 발생합니다.
    탐측이 네트워크 유량을 증가시켰다.이 점은 주의해야 한다.
    참조 링크
    https://www.codeproject.com/Articles/117557/Set-Keep-Alive-Values

    좋은 웹페이지 즐겨찾기