2

我正在使用 C# 窗口应用程序表单处理 TCP 多线程服务器,我正在尝试检测客户端机器是否已关闭并与服务器断开连接。我已经阅读了一些帖子并有一些想法:

如何判断tcp是否连接?

立即检测客户端与服务器套接字的断开连接

但我不确定在哪里调用该函数IsConnected

我的代码如下:

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; }
    }
}

感谢帮助。

4

1 回答 1

4

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

于 2013-04-01T11:53:41.130 回答