C# Server Socket and Client Socket

I have a client-server application that communicates each other over a socket connection.
My problem is: i don't know how can i signal the server that the client is stopped.
If i use clientSocket.Close() or clientSocket.Disconnect(true), the server is informed
after 1-1.5 minutes and this is to late. On the server side i start a thread for each client that gets connected to the server and i have to know when a client is disconnected. Thanks in advance
BorsecAsked:
Who is Participating?
 
VoloxCommented:
If you are using TCP/IP I would suggest using the built-in keep alives that are a part of the TCP/IP stack.  To enable them within .Net you ought to be able to use the Socket.SetSocketOption() method (http://msdn.microsoft.com/en-us/library/1011kecd(v=VS.90).aspx)  However some people have reported issues with getting the option to turn on that way and claim you have to use the lower level Socket.IOControl() method (http://msdn.microsoft.com/en-us/library/8a3744sh(v=VS.90).aspx).  

I had the following samples in my notes from when I was doing some other socket work.  I have to admit that I don't know where I snagged them from (so I apologize that I can't pass on credit) and I've never had the need to implement them so I can't speak to their particular effectiveness.
Socket sck, server;

server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

server.Bind(new IPEndPoint(IPAddress.Any, 5000));
server.Listen(5);
sck = server.Accept();
 
sck.SetSocketOption(SocketOptionLevel.Tcp,SocketOptionName.KeepAlive,0);

// Other (harder) method

public static void SetTcpKeepAlive(Socket socket, uint keepaliveTime, uint keepaliveInterval) 
{ 
// Native structure for keep alive
/*
struct tcp_keepalive { 
    ULONG onoff; 
    ULONG keepalivetime; 
    ULONG keepaliveinterval; 
};
*/

 // marshal the equivalent of the native structure into a byte array 
 uint dummy = 0; 
 byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3]; 
 BitConverter.GetBytes((uint)(keepaliveTime)).CopyTo(inOptionValues, 0); 
 BitConverter.GetBytes((uint)keepaliveTime).CopyTo(inOptionValues, Marshal.SizeOf(dummy)); 
 BitConverter.GetBytes((uint)keepaliveInterval).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2); 
 
 // write to Socket IOControl 
 socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null); 
 }

Open in new window

0
 
HugoHiaslCommented:
Did you try to send some data every 5 seconds? When the client is disconnected this should lead to an exception that can be handled.
0
 
BorsecAuthor Commented:
Thank you HugoHiasl, but i can't do this because the messages that are trasmitted betwen client and server are very important and don't want to create a standard message to check if the client is disconected. I want the client to notify the server that he is disconected.
0
 
akhileshcoerCommented:
Before closing send a message to server [CLOSE]. Then you can close connection at your end and client can also.

The only overhead is you need to check this message in every message which is being sent.

-Hope this helps
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.