いくつかの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_uint64
8バイトが送信され、read_uint64
8バイトが受信されます。このコードは通常、1つの接続の関数で128回繰り返されます。
私の質問は、なぜ小さなデータの塊を読み書きすることが速度を大幅に低下させるのかということです。開くのがTCP_NODELAY
悪い考えですか?書き込みと読み取りが待たないように、TCP / IP接続で何を設定する必要がありますか?
完全なコードが利用可能ここ。