 <p>In <em>async</em> <code>Begin*</code> is always followed by <code>End*</code>. See Using an <a href="http://msdn.microsoft.com/en-us/library/5w7b7x5f.aspx" rel="nofollow">Asynchronous Server Socket</a>. Your accept method should be something like:</p> <pre><code>try { listener.Bind(localEP); listener.Listen(10); while (true) { allDone.Reset(); Console.WriteLine("Waiting for a connection..."); listener.BeginAccept( new AsyncCallback(SocketListener.acceptCallback), listener ); allDone.WaitOne(); } } catch (Exception e) { </code></pre> <p>Server, means that an app that listens on specified port/ip. Is usually, <em>always</em> in a listening mode - that's why it is called a server. It can <em>connect</em> and <em>disconnect</em> a client, but is always in <em>listening</em> mode.</p> <p>This means, when a server disconnects a client - <em>even then</em> - it is in listening mode; meaning it can accept the incoming connections as well.</p> <p>Though, disconnection request can come from client or can be forcefully applied by server.</p> <p>The process for a server is:</p> <ol> <li>Bind to socket</li> <li>Listen</li> <li>Accept connections</li> </ol> <p>The process for client is:</p> <ol> <li>Connect to the server</li> <li>Send/receive messages</li> </ol> <p>There are several ways for server to handle the incoming clients, couple, as follows:</p> <ul> <li>Incoming connections are maintained in a list, for instance within a <code>List&lt;TcpClient&gt;</code>.</li> <li>One way of handling the incoming clients is through threads. For instance, for each incoming client, spawn a thread that would handle the communication between server and client. For instance, <a href="http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server" rel="nofollow">checkout this example</a>.</li> </ul> <p>_</p> <pre><code>private void ListenForClients() { this.tcpListener.Start(); while (true) { //blocks until a client has connected to the server TcpClient client = this.tcpListener.AcceptTcpClient(); //create a thread to handle communication //with connected client Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); clientThread.Start(client); } } </code></pre> <ul> <li>Use single thread and use context switching to manage client communications (TX/RX).</li> </ul>