マニュアルページが言うように、Unix ソケットは常に信頼できます。 SOCK_STREAM
の違い と SOCK_DGRAM
ソケットからデータを消費するセマンティクスにあります。
ストリーム ソケットを使用すると、任意のバイト数を読み取ることができますが、バイト シーケンスは保持されます。つまり、送信側が 4K のデータをソケットに書き込むと、受信側はそのデータをバイト単位で消費できます。逆の場合も同様です。送信者は、受信者が 1 回の読み取りで消費できるソケットにいくつかの小さなメッセージを書き込むことができます。ストリーム ソケットはメッセージ境界を保持しません。
一方、データグラム ソケットはこれらの境界を保持します。送信者による 1 回の書き込みは、常に受信者による 1 回の読み取りに対応します (受信者のバッファーが read(2)
に指定されている場合でも)。 または recv(2)
はそのメッセージよりも小さいです)。
したがって、アプリケーション プロトコルにメッセージ サイズの上限がわかっている小さなメッセージがある場合は、SOCK_DGRAM
を使用することをお勧めします。 そのほうが管理しやすいからです。
プロトコルが任意の長いメッセージ ペイロードを呼び出す場合、または構造化されていないストリーム (生のオーディオなど) である場合は、SOCK_STREAM
を選択します。 必要なバッファリングを行います。
どちらのタイプもローカルのカーネル内メモリを通過するだけなので、パフォーマンスは同じはずです。バッファ管理だけが異なります。
<オール>
考えられる違いの 1 つは、メッセージの境界です。データグラムは、自然なメッセージ境界であるデータグラムとともに全体として配信されます。ストリーム ソケットを使用すると、N バイトを読み取ることができ、ソケットは N バイトの準備が整うまでブロックされます。しかし、これは明確なメッセージ境界がないことを意味します。
すべての条件が同じであれば、速度が問題になる場合は、計測して測定します。 (ストリーム ソケットのみが組み込みの信頼できる順序付けされたトランスポートを提供し、データグラム ソケットのみが 複数 への送信に使用できることは既にご存じだと思います。 レシーバー)。
主な違いは、一方が接続ベースであることです (STREAM
) で、もう一方は コネクションレス です (DGRAM
) - 通常、ストリーム指向通信とパケット指向通信の違いはそれほど重要ではありません。
SOCK_STREAM
で listen
など、すべての接続処理を取得できます。 /accept
接続が反対側で閉じられているかどうかがわかります。
SEQPACKET
もあることに注意してください まだ接続指向ですが、メッセージ境界を保持するソケット タイプ (これにより、STREAM
の上にメッセージ指向のレイヤーを実装する必要がなくなる可能性があります) ソケット)
これらすべてのタイプのデータ転送パフォーマンスは似ていると思いますが、主な違いは、必要なセマンティクスです。