日の当たらない 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 を接続指向にしたもの

という所でしょうか。

*1:送信した順番どおりに受信できるか?

*2:送信したデータが勝手に消失しないか?

*3:分けて送ったデータがくっ付いたりしないか?

*4:server,client間の双方向で送受信できるか?

*5:client側でbindしてからsendmsgすることで可能