我寫了一個TCP服務器來使用BeginAccept/EndAccept模式。有了這個,我使用TcpClient編寫了一個簡單的UnitTest,並測量了每個部分。所有測試都是localhost,所以我很驚訝地看到TCP連接持續1秒。我已經設置了Socket.NoDelay = true
,但我相信這隻會影響發送/接收。我沒有收到第一包數據。任何幫助或想法加快這一點讚賞。有什麼辦法可以改善TCP連接時間嗎?
注:我不能改變客戶端保持連接打開,我需要能夠處理大量的每秒如果可能的請求。
服務器端:
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);
}
}
簡單的測試客戶端:
[TestMethod()]
public void ClientTest()
{
TestContext.BeginTimer("Connection");
TcpClient client = new TcpClient("localhost", 10300);
NetworkStream stream = client.GetStream();
TestContext.EndTimer("Connection");
...
使用負載測試我裝25個用戶,而交易 「連接」 始終以超過1秒。
嘗試使用嗅探Wireshark的,看看發生了什麼的TCP報文。 – Sjoerd 2012-04-27 06:55:13
@esac:可能是主機名解析問題。是的,我看到主機名是「localhost」。但是你可以嘗試通過IP地址建立連接嗎? – Dennis 2012-04-27 07:09:44
您是否正確釋放連接?您使用哪個操作系統作爲服務器?如果您運行的是Windows的非服務器版本,則很可能是由於連接限制而放慢速度。請參閱此[線程](http://stackoverflow.com/questions/657874/max-tcp-connections-to-a-machine)以獲取更多信息。 – 2012-04-27 10:39:38