提问人:RTC222 提问时间:5/3/2020 更新时间:5/4/2020 访问量:1914
Unix 域SOCK_DGRAM和 SOCK_SEQPACKET 之间的区别?
Difference between Unix domain SOCK_DGRAM and SOCK_SEQPACKET?
问:
根据 Unix 套接字的 Linux 手册页,“UNIX 域中的有效套接字类型是......SOCK_DGRAM,对于保留消息边界的面向数据报的套接字(与大多数 UNIX 实现一样,UNIX 域数据报套接字始终是可靠的,并且不会对数据报重新排序);(从 Linux 2.6.4 开始)SOCK_SEQPACKET,对于面向连接的序列数据包套接字,保留消息边界,并按照发送消息的顺序传递消息。(http://man7.org/linux/man-pages/man7/unix.7.html)。
我认为“始终可靠,不要对数据报重新排序”与“按发送顺序传递消息”相同。
SOCK_DGRAM 和 SOCK_SEQPACKET 有什么实际区别?
答:
在UDP和TCP的帮助下,可以更好地理解这种差异。 像UDP(less-connection-less)这样的协议使用SOCK_DGRAM、实现
像TCP(connection-oriented )这样的协议使用SOCK_STREAM。但是,甚至可以使用SOCK_SEQPACKET。两者之间的差异非常小,TCP也可以使用后者来实现。事实上,SOCK_SEQPACKET在某种程度上是两者的混合体。 STCP 是 SOCK_SEQPACKET 的一个用例。本文说明:http://urchin.earth.li/~twic/Sequenced_Packets_Over_Ordinary_TCP.html
这是一篇详细讨论这个问题的帖子。
在 UNIX 域套接字的上下文中,两者之间的主要区别是“面向数据报”与“面向连接”。
如果SOCK_DGRAM您不创建连接(例如,与服务器),则只需将数据包发送到服务器套接字。如果服务器需要回复,你需要创建自己的套接字,让服务器知道这个套接字,然后服务器可以向它发送回复。非常不方便,如果你真的需要连接,但当你只需要单向通信时会很有用,即发送一些通知。
当您需要面向连接的方法时,SOCK_SEQPACKET是要走的路。
下一个:找到最小值和最大值及其位置
评论