似乎至少有3种不同的本地/ unix套接字类型(PF_UNIX),SOCK_STREAM,SOCK_DGRAM和SOCK_SEQPACKET.
虽然我知道SOCK_STREAM为您提供双向字节流,如TCP或双向管道,而另外两个为您提供了一个消息/数据包API,SOCK_DGRAM和SOCK_SEQPACKET的unix套接字之间有什么区别?
由于这些只是本地的,我想不出有人以一种可以重新排序数据包的方式实现SOCK_DGRAM的好理由.
此外,SOCK_DGRAM/SOCK_SEQPACKET是否采用流量控制,或者在读取速度慢的情况下可以丢弃消息?
R..*_*R.. 25
这是一篇关于预期用例的好文章SOCK_SEQPACKET,它在IP协议族中并不真正可用,以及如何使用现有的TCP语义获得相同的东西:
http://urchin.earth.li/~twic/Sequenced_Packets_Over_Ordinary_TCP.html
请注意,SOCK_SEQPACKET行为SOCK_STREAM要比得多SOCK_DGRAM.
引用网站引用:
SOCK_SEQPACKET套接字类型类似于SOCK_STREAM类型,也是面向连接的.这些类型之间的唯一区别是使用SOCK_SEQPACKET类型维护记录边界.可以使用一个或多个输出操作发送记录,并使用一个或多个输入操作接收记录,但是单个操作永远不会传输多个记录的部分.通过recvmsg()函数返回的接收消息标志中的MSG_EOR标志,接收器可以看到记录边界.无论是否施加最大记录大小,都是协议特定的.
小智 8
我认为这里的主要区别SOCK_SEQPACKET是conneciton-oriented,而SOCK_DGRAM不是。
当有多个客户端进程与之通信时,这在连接的服务器端(侦听 UNIX 套接字的进程)最重要:
使用SOCK_DGRAM,您将直接在侦听套接字上获得交错的客户端数据报。使用SOCK_SEQPACKET,您将使用 为每个客户端生成一个单独的客户端套接字accept,从而分别从每个客户端接收数据报。
引用man 3 accept:
accept() 系统调用与基于连接的套接字类型(SOCK_STREAM、SOCK_SEQPACKET)一起使用。
socket(2)linux-provided manpage:"DGRAM:datagrams(无连接,不可靠消息),SEQPACKET:有序,可靠,[双向]基于连接的数据报传输路径".显着差异.
unix(7)linux提供的manpage说:"SOCK_DGRAM,用于面向数据报的套接字,它保留消息边界[但不一定是顺序] [...] SOCK_SEQPACKET,用于面向连接的套接字,它保留消息边界并传递消息他们被发送的顺序."
该标准允许您使用SOCK_DGRAM获得重新排序的数据包.(换句话说,如果一个操作系统按顺序交给你,那就是一个特定于实现的功能.或者只是纯粹的计时运气.)
Linux中的af_file/af_unix实现中有流控制,但根本不需要与标准指定的行为相关联.