3

TCP接続の終了についていくつか質問があります。

  1. クライアントはTcpを使用してサーバーに接続し、でクライアントを受け入れた後、で listener.BeginAcceptTcpClient(ConnectionEstabilishedCallback, null);読み取りを開始しますnetworkStream.BeginRead(....)
    メッセージを待っている間にクライアントが切断するとどうなりますか?(たとえば、電源やインターネットなどが失われます)
    いつ発生したかを知るにはどうすればよいですか?

  2. 読み取りが成功した後、私はいくつかのことをしてから、networkStream.Close(); client.Close();「クライアントには何が表示されますか?」接続を「正常に」終了するにはどうすればよいですか?

  3. (BeginReadを使用して)読み取りを待ってから(別のスレッドで)同じストリームを閉じるとどうなりますか?

編集して追加:クライアントとサーバーの間でピンポンメッセージが表示されます。それで十分?pingを受信しない場合は、NetworkStreamを終了しますか?確かにもっと良いものがあるに違いありません。

4

3 に答える 3

2

メッセージを待っている間にクライアントが切断するとどうなりますか?(たとえば、電源やインターネットなどが失われます)いつ発生したかを知るにはどうすればよいですか?

切断の理由が異なれば、さまざまなことが起こります。

から0バイトを受信すると、正常な切断が検出されますsocket.EndRead。他のシャットダウンはSocketExceptionEndReadまたはSend

読み取りが成功した後、いくつかの処理を行ってから、networkStream.Close();を呼び出します。client.Close(); クライアントには何が表示されますか?接続を「正常に」終了するにはどうすればよいですか?

Closeはそれを優雅に行います。

(BeginReadを使用して)読み取りを待ってから(別のスレッドで)同じストリームを閉じるとどうなりますか?

例外が発生します。(クライアントを破棄するObjectDisposedException場合)またはIOException

于 2011-06-23T14:19:09.820 に答える
2

1-ケーブルが抜かれているためにクライアントが切断された場合、次のソケットの読み取りまたは書き込みまでわかりません。また、tcpClient.Connectedプロパティの値は信頼できず、最後の通信に応じた値であることに注意してください。したがって、最後の通信が成功した場合、その値はtrueであり、それ以外の場合はfalseです。詳細については、これを確認してください。

2-ネットワークストリームとクライアントを閉じると、これはクライアントの正常な終了です。

3-わからない、テストしてみてください。

ケーブルが抜かれているなどの理由で接続が失われていることに気付いた場合、適切なIsConnected値を取得するには、tcpへの読み取りまたは書き込み中に失われた接続に注意する必要があるため、試してみてtcpclientメンバーにアクセスする必要があります。 -その操作をキャッチ...

このIsConnectedプロパティを使用して、tcpClientが接続されているかどうかを確認します。

public static bool IsConnected
{
    get
    {
        try
        {
            //return _tcpClient != null && _tcpClient.Client != null && _tcpClient.Client.Connected;

            if (_tcpClient != null && _tcpClient.Client != null && _tcpClient.Client.Connected)
            {

                /* As the documentation:
                    * When passing SelectMode.SelectRead as a parameter to the Poll method it will return 
                    * -either- true if Socket.Listen(Int32) has been called and a connection is pending;
                    * -or- true if data is available for reading; 
                    * -or- true if the connection has been closed, reset, or terminated; 
                    * otherwise, returns false
                    */

                // Detect if client disconnected
                if (_tcpClient.Client.Poll(0, SelectMode.SelectRead))
                {
                    byte[] buff = new byte[1];
                    if (_tcpClient.Client.Receive(buff, SocketFlags.Peek) == 0)
                    {
                        // Client disconnected
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                }

                return true;
            }
            else
            {
                return false;
            }
        }
        catch
        {
            return false;
        }
    }
}
于 2011-06-23T14:06:53.187 に答える
-1
public class Example
{
    static NetworkStream stream;
    static TcpClient client;

    public static void Main(String[] args)

        String message = String.Empty;

        //TCP connection
 Recon: Console.WriteLine("Connecting...");
        Int32 port = 3333;
        try
        {
            client = new TcpClient("ip.ip.ip.ip", port); //Try to connect
        }
        catch
        {
            Console.WriteLine("Problem while connecting!");
            Thread.Sleep(10000); //Waiting 10s before reconnect
            goto Recon;
        }

        Console.WriteLine("Connection established!\n");

        stream = client.GetStream();

        while (true)
        {

            //Buffer
            byte[] received_bytes = new Byte[1024];
            message = "";

            Console.WriteLine("Waiting to receive message...\n");

            Int32 bytes = stream.Read(received_bytes, 0, received_bytes.Length);
            message = System.Text.Encoding.GetEncoding("iso-8859-1").GetString(received_bytes, 0, bytes);

            if (bytes == 0) //If connection abort while reading
            {
                Console.WriteLine("Connection failed!");

                //Recconecting
                goto Recon;
            }

            Console.WriteLine("Received message: " + message);
        }
    }
}
于 2011-06-23T13:22:06.137 に答える