Is there any way to improve TCP connection time?
c#, connection, performance-testing, sockets, tcp
Solution
Not sure why, but simply changing this:
TestContext.BeginTimer("Connection");
TcpClient client = new TcpClient("localhost", 10300);
TestContext.EndTimer("Connection");
To this:
TestContext.BeginTimer("Connection");
TcpClient client = new TcpClient();
client.Connect("localhost", 10300);
TestContext.EndTimer("Connection");
Drops the time from 1 second to .13 seconds. Will have to investigate as to why, but hopefully this will help somebody out in the future.
Problem
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 `Socket.NoDelay = true` 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. 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. Server Side: ``` 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); } } ``` Simple Test Client: ``` [TestMethod()] public void ClientTest() { TestContext.BeginTimer("Connection"); TcpClient client = new TcpClient("localhost", 10300); NetworkStream stream = client.GetStream(); TestContext.EndTimer("Connection"); ... ``` Using a LoadTest I loaded 25 users, and the Transaction "Connection" always takes above 1 second.