Unix套接字,SOCK_SEQPACKET与SOCK_DGRAM

use*_*770 50 c unix

似乎至少有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标志,接收器可以看到记录边界.无论是否施加最大记录大小,都是协议特定的.


mod*_*ine 9

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

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


小智 8

我认为这里的主要区别SOCK_SEQPACKETconneciton-oriented,而SOCK_DGRAM不是。

当有多个客户端进程与之通信时,这在连接的服务器端(侦听 UNIX 套接字的进程)最重要:

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

引用man 3 accept

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


jør*_*sen 6

socket(2)linux-provided manpage:"DGRAM:datagrams(无连接,不可靠消息),SEQPACKET:有序,可靠,[双向]基于连接的数据报传输路径".显着差异.

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

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

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