TCP / IPクライアント - サーバー通信が遅い

TCP / IPクライアント - サーバー通信が遅い

いくつかのWebアプリケーションを作成しました。 TCP / IPプロトコルを使用したクライアント - サーバーソリューション。クライアントはサーバーに接続します。彼らは毎秒複数の接続を確立します。通信は、接続ごとに数百回インターリーブされ、読み書きされるバイト単位で構成されます。これは私のアプリケーションの問題です。接続の長さ(バイト)が長くなると、通信速度は耐えられなくなります(1つの要求は5秒間続きます)。問題は、短いデータ(約8バイト)のインターリーブの読み書きにあるようです。

私のプログラムは次のとおりです

fd = socket(AF_INET, SOCK_STREAM, 0);

if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void *)&reuse, (socklen_t)sizeof(reuse)) < 0) {
    // ...
}

if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (void *)&reuse, (socklen_t)sizeof(reuse)) < 0) {
    // ...
}

init_sockaddr(&server_addr, serverport);

if (bind(fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
    // ...
}

if (listen(fd, 2048) < 0) {
    // ...
}

while (1) {
    int cl_fd = accept(fd, &sockaddr_in, &sockaddr_len);

    if (read_message(cl_fd, 0, ipv4) < 0) {
        // ...
    }
}

read_message関数の問題のコードは次のとおりです。

if (write_uint64(fd, n) < 0) {
    // ...
}

if (write_uint64(fd, TASK_SIZE) < 0) {
    // ...
}

if (read_uint64(fd, &clid) < 0) {
    // ...
}

write_uint648バイトが送信され、read_uint648バイトが受信されます。このコードは通常、1つの接続の関数で128回繰り返されます。

私の質問は、なぜ小さなデータの塊を読み書きすることが速度を大幅に低下させるのかということです。開くのがTCP_NODELAY悪い考えですか?書き込みと読み取りが待たないように、TCP / IP接続で何を設定する必要がありますか?

完全なコードが利用可能ここ

関連情報