Unix域SOCK_DGRAM和SOCK_SEQPACKET的区别?

问题描述 投票:1回答:1

根据Linux关于Unix套接字的手册页面,"UNIX域中有效的套接字类型是......。SOCK_DGRAM,用于面向数据报的套接字,它保留了消息边界(因为在大多数UNIX实现上,UNIX域数据报套接字总是可靠的,而且不会对数据报重新排序);(从Linux 2.6.4开始)SOCK_SEQPACKET,用于面向连接的顺序包套接字,它保留了消息边界,并按照发送的顺序传送消息。" (http:/man7.orglinuxman-pagesman7unix.7.html。).

我以为 "永远可靠,不重排数据报 "和 "按发送顺序传送消息 "是一样的。

SOCK_DGRAM和SOCK_SEQPACKET有什么实际区别?

c linux sockets unix posix
1个回答
1
投票

通过UDP和TCP的帮助,可以更好地理解两者的区别。像UDP(无连接)这样的协议使用SOCK_DGRAM。实施

像TCP(面向连接的)这样的协议使用SOCK_STREAM。但是,甚至可以使用SOCK_SEQPACKET。两者的区别非常小,TCP也可以使用后者来实现。事实上,SOCK_SEQPACKET在某种程度上是两者的混合体。STCP就是SOCK_SEQPACKET的一个用例。在这篇文章中进行了解释。http:/urchin.earth.li~twicSequenced_Packets_Over_Ordinary_TCP.html。

这里有一个 岗位 中对此进行了详细的讨论。


1
投票

在UNIX域套接字的上下文中,两者的主要区别是 "面向数据报 "与 "面向连接"。

在SOCK_DGRAM的情况下,你并没有创建一个连接(比如到服务器),你只是向服务器套接字发送数据包。而如果服务器需要回复,你需要创建自己的socket,让服务器知道这个socket,然后服务器就可以向它发送回复。如果你真的需要一个连接,那就非常不方便,但如果你只是需要单向通信,比如发送一些通知,那就很有用。

当你需要面向连接的方法时,SOCK_SEQPACKET就是最好的选择。

© www.soinside.com 2019 - 2024. All rights reserved.