6

How can you check if a non-blocking socket is disconnect without using Poll?

Farzin Zaker
  • 3,578
  • 3
  • 25
  • 35
Will
  • 10,013
  • 9
  • 45
  • 77

2 Answers2

5

Create a cusomt socket class inheriting .net socket class :

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

Then use it like this :

        var socket = new CustomSocket(
                //parameters
                );

        socket.SocketClosed += socket_SocketClosed;
        socket.EventsEnabled = true;


        void socket_SocketClosed(Socket socket)
        {
            // do what you want
        }

I have just implemented a Socket close event in each socket. so your application should register event handlers for this event. then socket will inform your application if it was closed itself ;)

if there was any problem with code, inform me.

Farzin Zaker
  • 3,578
  • 3
  • 25
  • 35
0

The Socket class has a Connected property. According to MSDN the call to check is non-blocking. Is this not what you're looking for?

Esteban Araya
  • 29,284
  • 24
  • 107
  • 141
  • The Connected property always seems to be true unless I disconnect the Socket myself. I just checked and even though the socket was disconnected by the remote server it still returns true. – Will Apr 18 '11 at 04:39