Unix套接字,SOCK_SEQPACKET与SOCK_DGRAM
看来有至less3种不同的本地/ Unixsocketstypes(PF_UNIX),SOCK_STREAM,SOCK_DGRAM和SOCK_SEQPACKET。
虽然我知道一个SOCK_STREAM给你一个双向字节stream,如TCP或双向pipe道,而另外两个给你一个messge / packet API,SOCK_DGRAM和SOCK_SEQPACKET的unix套接字有什么区别?
由于这些只是本地的,我想不出有什么好的理由来实现SOCK_DGRAM的方式,它可以重新sorting数据包。
此外,SOCK_DGRAM / SOCK_SEQPACKET是否采用stream量控制,或者在读取缓慢的情况下可以丢弃消息?
下面是关于SOCK_SEQPACKET
预期用例的一篇很好的文章,它在IP协议族中并不真正可用,以及如何用现有的TCP语义获得相同的结果:
http://urchin.earth.li/~twic/Sequenced_Packets_Over_Ordinary_TCP.html
请注意, SOCK_SEQPACKET
在行为上比SOCK_STREAM
更接近SOCK_DGRAM
。
引用网站引用:
SOCK_SEQPACKET套接字types与SOCK_STREAMtypes相似,也是面向连接的。 这些types之间的唯一区别是使用SOCK_SEQPACKETtypes来维护logging边界。 可以使用一个或多个输出操作来发送logging,并使用一个或多个input操作来接收logging,但是单个操作不会传送多于一条logging的部分。 logging边界通过recvmsg()函数返回的接收消息标志中的MSG_EOR标志对接收者是可见的。 最大logging大小是强加的,它是协议特定的。
SOCK_SEQPACKET为您提供了SOCK_STREAM的保证(即保留sorting,保证传送,不重复),但与SOCK_DGRAM一样描绘了分组边界。 所以,基本上它是两种协议types的混合。
在TCP / IP系列中, SCTP实现了SOCK_STREAM(TCP-like)和SOCK_SEQPACKET。 不幸的是,它不是在Windows上可用。
socket(2)Linux提供的手册页:“DGRAM:数据报(无连接,不可靠的消息),SEQPACKET:顺序的,可靠的,[双向的]基于连接的数据报传输path”。
unix(7)linux提供的manpage说:“SOCK_DGRAM,对于面向数据报的套接字,保留消息边界[但不一定是顺序] […] SOCK_SEQPACKET,对于面向连接的套接字来说,保留消息边界并传递消息他们发出的命令“。
该标准允许您使用SOCK_DGRAM获得重新sorting的数据包。 (换句话说,如果一个操作系统按顺序把它们交给你,这是一个特定于实现的特性,或者只是纯粹的定时运气。
在Linux中的af_file / af_unix实现中存在stream量控制,但是根本不需要与标准的指定行为相关联。
像TCP和UDP套接字一样,SCTP(stream控制传输协议)套接字有两种forms,(一对一)和(一对多)端点之间的。 一对一使用SOCK_STREAM,一对多使用SOCK_SEQPACKET