检查套接字是否断开连接

本文关键字:连接 断开 是否 套接字 检查 | 更新日期: 2023-09-27 17:50:30

如何在不使用Poll的情况下检查非阻塞套接字是否断开连接?

检查套接字是否断开连接

创建一个自定义套接字类继承。net套接字类:

public delegate void SocketEventHandler(Socket socket);
    public class CustomSocket : Socket
    {
        private readonly Timer timer;
        private const int INTERVAL = 1000;
        public CustomSocket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
            : base(addressFamily, socketType, protocolType)
        {
            timer = new Timer { Interval = INTERVAL };
            timer.Tick += TimerTick;
        }
        public CustomSocket(SocketInformation socketInformation)
            : base(socketInformation)
        {
            timer = new Timer { Interval = INTERVAL };
            timer.Tick += TimerTick;
        }
        private readonly List<SocketEventHandler> onCloseHandlers = new List<SocketEventHandler>();
        public event SocketEventHandler SocketClosed
        {
            add { onCloseHandlers.Add(value); }
            remove { onCloseHandlers.Remove(value); }
        }
        public bool EventsEnabled
        {
            set
            {
                if(value)
                    timer.Start();
                else
                    timer.Stop();
            }
        }
        private void TimerTick(object sender, EventArgs e)
        {
            if (!Connected)
            {
                foreach (var socketEventHandler in onCloseHandlers)
                    socketEventHandler.Invoke(this);
                EventsEnabled = false;
            }
        }
        // Hiding base connected property
        public new bool Connected
        {
           get
           {
              bool part1 = Poll(1000, SelectMode.SelectRead);
              bool part2 = (Available == 0);
              if (part1 & part2)
                 return false;
              else
                 return true;
           }
        }
    }

然后像这样使用:

        var socket = new CustomSocket(
                //parameters
                );
        socket.SocketClosed += socket_SocketClosed;
        socket.EventsEnabled = true;

        void socket_SocketClosed(Socket socket)
        {
            // do what you want
        }
我刚刚在每个套接字中实现了一个套接字关闭事件。因此,应用程序应该为此事件注册事件处理程序。然后套接字将通知您的应用程序,如果它已关闭;)

如果代码有任何问题,请告诉我

Socket类具有Connected属性。根据MSDN,对check的调用是非阻塞的。这不是你要找的吗?