How can you check if a non-blocking socket is disconnect without using Poll?
2 Answers
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.
7 Comments
Will
Socket.Connected is unrealiable
Farzin Zaker
new Connected property implemented in Custom Class. try it, it will work.
Will
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.
Farzin Zaker
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.
Will
It does work on windows with mono but on linux with mono it does not.
|
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
Will
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.