60

It seems there's atleast 3 different local/unix socket types (AF_UNIX) , SOCK_STREAM, SOCK_DGRAM and SOCK_SEQPACKET.

While I know that a SOCK_STREAM gives you a bi-directional byte stream, like TCP or a bidirectional pipe, and the other two gives you a messge/packet API, what's the difference between a unix socket of SOCK_DGRAM and SOCK_SEQPACKET ?

As these are local only, I can't think of a good reason someone would implement SOCK_DGRAM in a manner it could reorder packets.

Also, does SOCK_DGRAM/SOCK_SEQPACKET employ flow control, or can messages be dropped in case of slow readers ?

4

5 に答える 5

10

SOCK_SEQPACKET は、SOCK_STREAM の保証 (つまり、順序の維持、保証された配信、重複なし) を提供しますが、SOCK_DGRAM と同様にパケット境界を線引きします。つまり、基本的には 2 つのプロトコル タイプが混在しています。

TCP/IP ファミリでは、SCTPは SOCK_STREAM (TCP のような) と SOCK_SEQPACKET の両方を実装しています。残念ながら、Windows では在庫がありません。

于 2012-04-11T15:27:41.170 に答える
6

socket(2) linux 提供のマンページ: 「DGRAM: データグラム (コネクションレスで信頼性の低いメッセージ)、SEQPACKET: シーケンス化された、信頼性の高い、[双方向] データグラムの接続ベースのデータ伝送パス」. 大きな違い。

unix (7) linux 提供のマンページには次のように書かれています。送信された順序です。」</p>

標準では、SOCK_DGRAM を使用して並べ替えられたパケットを取得することが許可されています。(つまり、OS がそれらを順番に渡した場合、それは実装固有の機能です。または、単にタイミングの運が良かっただけです。)

Linux の af_file/af_unix 実装にはフロー制御がありますが、それは標準指定された動作と関連付ける必要はまったくありません。

于 2012-04-11T13:03:25.997 に答える
0

TCP および UDP ソケットと同様に、エンドポイント間に (1 対 1) と (1 対多) の 2 つの形式を持つ SCTP (ストリーム制御伝送プロトコル) ソケットがあります。1 対 1 では SOCK_STREAM を使用し、1 対多では SOCK_SEQPACKET を使用します。

于 2015-05-15T02:02:10.597 に答える