tags:

views:

515

answers:

3

Hi, the MSDN docs for the Connected property on Socket say the following:

The value of the Connected property reflects the state of the connection as of the most recent operation. If you need to determine the current state of the connection, make a nonblocking, zero-byte Send call. If the call returns successfully or throws a WAEWOULDBLOCK error code (10035), then the socket is still connected; otherwise, the socket is no longer connected.

I need to determine the current state of the connection - how do i make a non-blocking, zero-byte send call?

+1  A: 

Socket.BeginSend

yodaj007
A: 
 socket.Send(new byte[] {});

While technically a blocking operation, this should finish immediately in all cases.

JSBangs
There are conditions where this will hang for some time
Jon B
+3  A: 

The example at the bottom of MSDN documentation for the Socket.Connected property (at least the .NET 3.5 version) shows how to do this:

// .Connect throws an exception if unsuccessful
client.Connect(anEndPoint);

// This is how you can determine whether a socket is still connected.
bool blockingState = client.Blocking;
try
{
    byte [] tmp = new byte[1];

    client.Blocking = false;
    client.Send(tmp, 0, 0);
    Console.WriteLine("Connected!");
}
catch (SocketException e) 
{
    // 10035 == WSAEWOULDBLOCK
    if (e.NativeErrorCode.Equals(10035))
        Console.WriteLine("Still Connected, but the Send would block");
    else
    {
        Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode);
    }
}
finally
{
    client.Blocking = blockingState;
}

 Console.WriteLine("Connected: {0}", client.Connected);
Matt Davis
Thanks - missed this.
Nosrama