C # Проверяет, отключен ли сокет?

#c# #events #sockets #polling

#c# #Мероприятия #сокеты #опрос

Вопрос:

Как вы можете проверить, отключен ли неблокирующий сокет без использования опроса?

Ответ №1:

Создайте класс сокета cusomt, наследующий класс сокета .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 amp; 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
        }
  

Я только что реализовал событие закрытия сокета в каждом сокете. итак, ваше приложение должно зарегистрировать обработчики событий для этого события. затем сокет сообщит вашему приложению, было ли оно закрыто само 😉

если были какие-либо проблемы с кодом, сообщите мне.

Комментарии:

1. Сокет. Подключение невозможно

2. новое свойство Connected реализовано в пользовательском классе. попробуйте, это сработает.

3. Метод опроса не работает в Linux. Даже когда сокет закрыт, он будет продолжать возвращать false. Вот почему я ищу способ без использования опроса.

4. вы хотите использовать этот метод в mono? Я отредактировал ответ, чтобы остановить распространение событий после закрытия сокета. Метод опроса работает у меня в Windows. Я не знаю, где вы хотите это использовать.

5. Это работает в Windows с mono, но в Linux с mono этого не происходит.

Ответ №2:

У Socket класса есть Connected свойство. Согласно MSDN, вызов для проверки неблокирующий. Это не то, что вы ищете?

Комментарии:

1. Свойство Connected всегда кажется истинным, если я сам не отключу сокет. Я только что проверил, и даже несмотря на то, что сокет был отключен удаленным сервером, он все равно возвращает true.