title: Is there any way to improve TCP connection time?
body: <p>I wrote a TCP server to use the BeginAccept/EndAccept pattern. With this, I coded up a simple UnitTest using a TcpClient, and measured each portion. All tests are localhost, so I am surprised to see that TCP connection is consistently taking 1 second. I have set the <code>Socket.NoDelay = true</code> although I believe this only affects Send/Receive. I am not receiving the first packet of data. Any help or ideas on speed this up are appreciated.</p>
  
  <p>Note: I can not change the client side to keep the connection open, and I need to be able to handle a lot of requests per second if possible.</p>
  
  <p>Server Side:</p>
  
  <pre><code>public void Start()
  {
      System.Net.IPHostEntry localhost = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
      System.Net.IPEndPoint endpoint;
      int port = Properties.Settings.Default.ListenPort;
  
      //
      // Setup the connection to listen on the first IP, and specified port
      //
      endpoint = new IPEndPoint(IPAddress.Any, port);
      listenSocket = new Socket(endpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
      listenSocket.Bind(endpoint);
      listenSocket.NoDelay = true; // do not wait 200 milliseconds for new data to be buffered on the connection
      listenSocket.Listen(int.MaxValue);
      Console.WriteLine("Listening on {0}:{1}", localhost.AddressList[0], port);
  
      //
      // Post the accept. The accept method will continuously post a new accept as soon as a connection is made
      //
      while (true)
      {
          accepted.Reset();
          Connection connection = connections.Pop();
          listenSocket.BeginAccept(AcceptCallback, connection);
          accepted.WaitOne();
      }
  }
  
  private static void AcceptCallback(IAsyncResult ar)
  {
      accepted.Set();
  
      Connection connection = ar.AsyncState as Connection;
      Socket remoteSocket = null;
  
      try
      {
          remoteSocket = listenSocket.EndAccept(ar);
          remoteSocket.NoDelay = true;                
          connection.RemoteSocket = remoteSocket;
  
          //
          // Start the Receive cycle
          //
          Receive(connection);             
      }
      catch (SocketException)
      {
          Disconnect(connection);
      }           
  }
  </code></pre>
  
  <p>Simple Test Client:</p>
  
  <pre><code>[TestMethod()]
  public void ClientTest()
  {
      TestContext.BeginTimer("Connection");
      TcpClient client = new TcpClient("localhost", 10300);
      NetworkStream stream = client.GetStream();
      TestContext.EndTimer("Connection");
      ...
  </code></pre>
  
  <p>Using a LoadTest I loaded 25 users, and the Transaction "Connection" always takes above 1 second.</p>