Solved

C# Server Socket and Client Socket

Posted on 2010-09-20
4
1,555 Views
Last Modified: 2012-05-10
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
0
Comment
Question by:Borsec
4 Comments
 
LVL 12

Expert Comment

by:HugoHiasl
ID: 33715145
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
 

Author Comment

by:Borsec
ID: 33715275
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
 
LVL 4

Expert Comment

by:akhileshcoer
ID: 33722087
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
 
LVL 8

Accepted Solution

by:
Volox earned 500 total points
ID: 33751385
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

Featured Post

Back Up Your Microsoft Windows Server®

Back up all your Microsoft Windows Server – on-premises, in remote locations, in private and hybrid clouds. Your entire Windows Server will be backed up in one easy step with patented, block-level disk imaging. We achieve RTOs (recovery time objectives) as low as 15 seconds.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction Although it is an old technology, serial ports are still being used by many hardware manufacturers. If you develop applications in C#, Microsoft .NET framework has SerialPort class to communicate with the serial ports.  I needed to…
This article describes a simple method to resize a control at runtime.  It includes ready-to-use source code and a complete sample demonstration application.  We'll also talk about C# Extension Methods. Introduction In one of my applications…
This Micro Tutorial hows how you can integrate  Mac OSX to a Windows Active Directory Domain. Apple has made it easy to allow users to bind their macs to a windows domain with relative ease. The following video show how to bind OSX Mavericks to …
In a recent question (https://www.experts-exchange.com/questions/28997919/Pagination-in-Adobe-Acrobat.html) here at Experts Exchange, a member asked how to add page numbers to a PDF file using Adobe Acrobat XI Pro. This short video Micro Tutorial sh…

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question