11.2. TCP_CORK ソケットオプション
TCP_CORK オプションは、ソケット内のすべてのデータパケットを収集し、バッファーが指定された制限を満たすまでそれらを送信しないようにします。これにより、TCP_CORK が無効になっている場合に、アプリケーションがカーネル領域にパケットを作成し、データを送信できるようになります。TCP_CORK は 、setsocketopt() 関数を使用してソケットファイルディスクリプタに設定されます。プログラムを開発する際にファイルから一括データを送信する必要がある場合は、TCP_CORK を sendfile() とともに使用することを考慮してください。
カーネル内でさまざまなコンポーネントによって論理パケットが構築される場合、setsockopt ソケット API を使用して TCP_CORK の値を 1 に設定することで、TCP_CORK を有効にします。これは "ソケットのコーキング" として知られています。TCP_CORK は、コルクが適切なタイミングで取り外されていないと、バグを引き起こす可能性があります。
次の例は、setsockopt ソケット API を介して TCP_CORK を有効にする方法を示しています。
int one = 1;
setsockopt(descriptor, SOL_TCP, TCP_CORK, &one, sizeof(one));
一部の環境では、カーネルがコルクをいつ取り除くかを識別できない場合は、次のように手動でコルクを取り除くことができます。
int zero = 0;
setsockopt(descriptor, SOL_TCP, TCP_CORK, &zero, sizeof(zero));
詳細は、お使いのシステムの sendfile(2) の man ページを参照してください。