BeginAccept/EndAccept パターンを使用する TCP サーバーを作成しました。これで、TcpClient を使用して単純な UnitTest をコーディングし、各部分を測定しました。すべてのテストは localhost であるため、TCP 接続が一貫して 1 秒かかっていることに驚きました。を設定しましたSocket.NoDelay = true
が、これは送受信のみに影響すると思います。データの最初のパケットを受信していません。これをスピードアップするための助けやアイデアは大歓迎です。
注: 接続を開いたままにするようにクライアント側を変更することはできません。また、可能であれば、1 秒あたりに多くの要求を処理できるようにする必要があります。
サーバ側:
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");
...
LoadTest を使用して 25 人のユーザーをロードしましたが、トランザクションの「接続」には常に 1 秒以上かかります。