Unix套接字,SOCK_SEQPACKET与SOCK_DGRAM

时间:2012-04-11 10:22:42

标签: c unix

似乎至少有3种不同的本地/ unix套接字类型(AF_UNIX),SOCK_STREAMSOCK_DGRAMSOCK_SEQPACKET

虽然我知道SOCK_STREAM为您提供了双向字节流,如TCP或双向管道,而另外两个为您提供了一个消息/数据包API,但是{i}的unix套接字之间的区别是什么? {1}}和SOCK_DGRAM

因为这些只是本地的,所以我想不出有人以一种可以重新排序数据包的方式实现SOCK_SEQPACKET的好理由。

此外,SOCK_DGRAM / SOCK_DGRAM是否使用流量控制,或者在读取速度慢的情况下可以删除邮件?

5 个答案:

答案 0 :(得分:23)

这是一篇关于SOCK_SEQPACKET的预期用例的好文章,它在IP协议系列中并不真正可用,以及如何使用现有的TCP语义获得相同的东西:

http://urchin.earth.li/~twic/Sequenced_Packets_Over_Ordinary_TCP.html

请注意SOCK_SEQPACKETSOCK_STREAM的行为距离SOCK_DGRAM更接近。

引用引用的网站:

  

SOCK_SEQPACKET套接字类型类似于SOCK_STREAM类型,也是面向连接的。这些之间的唯一区别   types是使用的维护记录边界   SOCK_SEQPACKET类型。可以使用一个或多个输出发送记录   操作和使用一个或多个输入操作接收,但a   单个操作永远不会传输多个记录的部分内容。记录   通过MSG_EOR标志,接收器可以看到边界   收到recvmsg()函数返回的消息标志。它是   特定于协议的是否强加了最大记录大小。

答案 1 :(得分:8)

SOCK_SEQPACKET为您提供SOCK_STREAM的保证(即保留排序,保证传送,无重复),但是具有描述的数据包边界,就像SOCK_DGRAM一样。所以,基本上它是两种协议类型的混合。

在TCP / IP系列中,SCTP实现SOCK_STREAM(类似TCP)和SOCK_SEQPACKET。不幸的是,Windows上没有库存。

答案 2 :(得分:6)

socket(2)linux提供的联机帮助页:“DGRAM:数据报(无连接,不可靠的消息),SEQPACKET:有序,可靠,[双向]基于连接的数据报数据传输路径”。显着差异。

unix(7)linux提供的manpage说:“SOCK_DGRAM,用于面向数据报的套接字,用于保存消息边界[但不一定是顺序] [...] SOCK_SEQPACKET,用于面向连接的套接字,它保留消息边界并按照发送的顺序传递消息。“

标准允许您使用SOCK_DGRAM重新排序数据包。 (换句话说,如果操作系统按顺序将它们交给你,那就是特定于实现的功能。或者只是纯粹的计时运气。)

Linux中的af_file / af_unix实现中有流控制,但根本不需要与标准指定行为相关联。

答案 3 :(得分:1)

与TCP和UDP套接字一样,SCTP(流控制传输协议)套接字在端点之间有两种形式,(一对一)和(一对多)。一对一使用SOCK_STREAM,一对多使用SOCK_SEQPACKET

答案 4 :(得分:1)

我认为这里的主要区别是SOCK_SEQPACKET不是面向连接的,而SOCK_DGRAM不是。

当有多个客户端进程正在与之通信时,这在连接的 server 端(在UNIX套接字上侦听的进程)方面尤为重要:

使用SOCK_DGRAM,您将直接在侦听套接字上获得交错的客户端数据报。使用SOCK_SEQPACKET,您将使用accept为每个客户端生成一个单独的 client 套接字,从而分别从每个客户端接收数据报。

引用man 3 accept

  

accept()系统调用与基于连接的套接字类型(SOCK_STREAM,SOCK_SEQPACKET)一起使用。