c# - TcpClient 在异步读取期间断开连接

标签 c# asynchronous tcp networkstream disconnect

我有几个关于完成 tcp 连接的问题。

  1. 客户端使用 Tcp 连接到我的服务器,在使用 listener.BeginAcceptTcpClient(ConnectionEstabilishedCallback, null); 接受客户端后,我开始使用 networkStream.BeginRead(. ...)
    当我等待消息时客户端断开连接会发生什么? (例如断电、断网等)
    我怎么知道它什么时候发生?

  2. 如果在成功读取之后,我做了一些事情,然后调用 networkStream.Close(); client.Close(); 客户端会看到什么?如何“优雅地”终止连接?

  3. 如果我正在等待读取(使用 BeginRead),然后(在不同的线程上)关闭同一个流,会发生什么情况?

编辑添加:我在客户端和服务器之间确实有一个乒乓消息。够了吗?如果我没有收到 ping,是否终止我的 NetworkStream?肯定有更好的东西。

最佳答案

1- 如果客户端因电缆拔出而断开连接,直到下一次读取或写入套接字时您才会知道。还要注意 tcpClient.Connected 属性值不可靠,它的值取决于上次通信;因此,如果最后一次通信成功,那么它的值为真,否则为假。有关该支票的更多信息 this .

2- 如果您关闭网络流和客户端,这就是客户端的正常终止。

3- 我不知道,测试一下。

如果您知道由于电缆拔出等原因导致连接丢失,那么要获得适当的 IsConnected 值,您必须在读取或写入 tcp 期间从连接丢失中获知,因此您需要通过以下方式访问 tcpclient 成员围绕其操作设置 try-catch ....

使用此 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;
        }
    }
}

关于c# - TcpClient 在异步读取期间断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6452992/

相关文章:

Ruby TCPSocket write 不起作用,但是 puts 可以吗?

c# - 在 LINQ 中选择多列而不加入

c# - "foreach"和扩展方法: ForEach的区别

c# - 异步方法上的 Task.Wait() 在本地工作,但不能通过其他方法工作

Django REST Framework 发出异步请求以响应

tcp - 客户端 channel 不处于可写状态(NIO)Netty

c++ - C++ TCP 中的 IPC First send() 和 recv() 调用需要更长的时间

c# - ASP.NET无效的脚本资源请求而不是重定向

c# - 如何在 .net 3.5 trackbar 中标记最小、最大、中心刻度?

python - 我该怎么做,以便一次只有一个线程可以查看本地json文件