当前位置: 首页 > 知识库问答 >
问题:

C#检测TCP客户端断开连接

郑晨
2023-03-14

我正在使用C#window应用程序表单对TCP多线程服务器进行工作,我正在尝试检测客户端的机器是否关闭并断开与服务器的连接。看了一些帖子,有了一些想法:

如何确定tcp是否连接?

我的代码如下:

public BindingList<Tablet> tabletList = new BindingList<Tablet>();
private Socket socket_Server = null;
    private Thread myThread = null;
    private Socket socket_Connect = null;
    private Dictionary<string, Socket> dic = new Dictionary<string, Socket> { };
    private string RemoteEndPoint;

socket_Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPAddress ServerIP = IPAddress.Parse("192.168.2.146");
        IPEndPoint point = new IPEndPoint(ServerIP, portNum);
        socket_Server.Bind(point);
        socket_Server.Listen(50);
        myThread = new Thread(Listen_Disp);
        myThread.IsBackground = true;
        myThread.Start();
        Console.WriteLine("Server start");

private void Listen_Disp()
    {
        try
        {
            while (true)
            {

                //This is not working
                for (int i = 0; i < tabletList.Count; i++)
                {
                    if (!SocketConnected(dic[tabletList[i].ip]))
                    {
                        Console.WriteLine(RemoteEndPoint + "disconnected");
                    }
                }

                try
                {
                    socket_Connect = socket_Server.Accept();
                    RemoteEndPoint = socket_Connect.RemoteEndPoint.ToString();
                    Console.WriteLine(RemoteEndPoint + " is connected");
                    dic.Add(RemoteEndPoint, socket_Connect);

                    Tablet newTablet = new Tablet();
                    newTablet.ip = RemoteEndPoint;
                    newTablet.status = "Online";
                    tabletList.Add(newTablet);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }

            Console.WriteLine("end of while");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }

static class SocketExtensions
{
    public static bool IsConnected(this Socket socket)
    {
        try
        {
            return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0);
        }
        catch (SocketException) { return false; }
    }
}

多谢帮忙。

共有1个答案

萧宁
2023-03-14

在这个问题上有很多错误的信息,其中一些存在于你链接的问题中。检测TCP断开的唯一可靠方法是尝试写入连接。读取超时也可以表示连接断开,但它也可能意味着许多其他事情,例如服务器卡死。读数时的EOS条件表示正常断开。IsConnected()方法和friends只给出您对这个套接字所做的事情的历史记录:它们不给出连接的当前状态。他们不能这样做,因为如果没有挂起的写请求,就没有要知道的状态。TCP不维护任何类似拨号音的内容。

 类似资料:
  • 我正在编写一个使用tcp套接字的服务器/客户端应用程序,我的问题是如何检测半开放连接,我计划使用keep-alive但有些人建议我做我自己的协议,所以我现在的计划是: 在服务器端: 服务器会等待10秒等待客户端发送数据,如果在给定的时间内服务器没有收到客户端的消息,服务器会将客户端标记为断开连接,否则,如果服务器收到客户端的消息,则会重新设置计时器。 我现在的问题是,这样行吗?还是我做错了?还是一

  • 当我再次调用时,第二次调用将按预期返回。但我想明白,为什么第一次打电话成功了?我是否遗漏了某些特定于TCP的细节?这种奇怪的(对我来说)行为只针对{活动,错误}连接。

  • 我正在用Java编写一个简单的TCP客户机/服务器程序对,如果客户机在10秒内还没有发送任何东西,服务器必须断开连接。socket.setsoTimeout()使我得到了这一点,服务器就可以很好地断开连接。问题是--我如何让客户端确定服务器是否关闭?目前,我使用DataOutputStream向服务器写入数据,这里的一些答案表明,向封闭套接字写入数据将引发IOException,但这不会发生。 编

  • 我想检查一下我的客户是否断开了连接。根据我的研究,一种可能的方式是我可以继续给客户写信。如果客户端未能接收到消息,则表示已断开连接。我向相应的客户端发送消息“Checking Connection:Client”clientNo。 我将clientNo 1连接到服务器,它接收 客户1 但是当我将另一个客户端连接到服务器时,我的clientNo1停止接收来自服务器的消息,我的clientNo2现在将

  • 我正在使用此示例的代码创建我的GRPC异步服务器: 因为我做了一项研究,在那里我发现我必须实现KeepAlive(https://grpc.github.io/grpc/cpp/md_doc_keepalive.html)我添加了以下几行: 到目前为止一切都很好,服务器工作正常,通信畅通。但是,我如何检测到客户端已断开连接?我为所谓的方法添加的行似乎不适合我。 我的错误在哪里?当客户端因任何原因断

  • 我使用这个(Android TCP连接增强的)教程来创建简单的JAVA TCPServer和Android TCPClient。它工作得很好,但使用这段代码我只能同时将一个设备连接到服务器。我必须更改什么才能连接多个设备?