日の当たらない SOCK_SEQPACKET
Linux Unixドメイン(PF_UNIX, AF_UNIX, PF_LOCAL, AF_LOCAL)のSOCK_SEQPACKETについて、検索してもひっかからないしかわいそうなので違いをまとめてみた。"man unix"をみるとSOCK_SEQPACKETは『kernel2.6.4以降で利用できる』と書いてあるので要注意。以下 Linux kernel 2.6.25.10 のソース (net/unix/af_unix.c) より。
kernel内部で呼ばれる関数の違い
func | unix_stream | unix_dgram | unix_seqpacket |
---|---|---|---|
connect | unix_stream_connect | unix_dgram_connect | unix_stream_connect |
accept | unix_accept | sock_no_accept | unix_accept |
poll | unix_poll | datagram_poll | datagram_poll |
listen | unix_listen | sock_no_listen | unix_listen |
sendmsg | unix_stream_sendmsg | unix_dgram_sendmsg | unix_seqpacket_sendmsg |
recvmsg | unix_stream_recvmsg | unix_dgram_recvmsg | unix_dgram_recvmsg |
機能の違い
func | SOCK_STREM | SOCK_DGRAM | SOCK_SEQPACKET |
---|---|---|---|
connect | 接続指向 | 非接続 | 接続指向 |
accept | ○ | × | ○ |
listen | ○ | × | ○ |
sendmsg | STREM用sendmsg | DGRAM用sendmsg | 接続チェック後DGRAM用semdmsg |
recvmsg | STREM用recvmsg | DGRAM用recvmsg | DGRAM用recvmsg |
順序性*1 | ○ | ○ | ○ |
信頼性*2 | ○ | ○ | ○ |
メッセージ境界*3 | × | ○ | ○ |
双方向通信*4 | ○ | △*5 | ○ |
その他 | バイトストリーム | データグラム | データグラム |
簡単にまとめると
- SOCK_STREAM は TCP とそっくり
- SOCK_DGRAM は UDP とそっくりだが順序性も信頼性もある点が違う
- SOCK_SEQPACKET は SOCK_DGRAM を接続指向にしたもの
という所でしょうか。