3

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 秒以上かかります。

4

2 に答える 2

4

理由はわかりませんが、単にこれを変更するだけです。

TestContext.BeginTimer("Connection");          
TcpClient client = new TcpClient("localhost", 10300);            
TestContext.EndTimer("Connection");

これに:

TestContext.BeginTimer("Connection");
TcpClient client = new TcpClient();
client.Connect("localhost", 10300);       
TestContext.EndTimer("Connection");

時間を1秒から.13秒に短縮します。理由を調査する必要がありますが、これが将来誰かを助けることを願っています。

于 2012-04-27T15:56:41.753 に答える
3

Ipv6アドレスとIpv4アドレスの両方に解決されるホストでTcpClientコンストラクターを使用して接続しようとすると、最初にIpv6を使用した接続が試行されます。失敗した場合は、Ipv6アドレスを使用して接続を試みます。これが1秒の遅延の原因です。これがMSDNリンクです:

于 2012-08-14T17:40:28.213 に答える