6

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

2 Answers 2

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.

Sign up to request clarification or add additional context in comments.

7 Comments

Socket.Connected is unrealiable
new Connected property implemented in Custom Class. try it, it will work.
The Poll method does not work on linux. Even when the socket is closed it will continue to return false. That is why I am looking for a way without using Poll.
you want to use this method in mono ? I have edited answer to stop propagating events after socket closed. Poll method is working for me in windows. I do not know where you want to use this.
It does work on windows with mono but on linux with mono it does not.
|
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?

1 Comment

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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.