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