【发布时间】:2020-08-17 03:07:12
【问题描述】:
根据 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 的实际区别是什么?
【问题讨论】:
-
socket SOCK_DGRAM 是一个流,socket SOCK_SEQPACKET 交换数据包(像 SOCK_DGRAM 所以 UDP 除了 UDP 连接较少,你可能会丢失数据包)
-
根据上面引用的手册页,“SOCK_STREAM,用于面向流的套接字;SOCK_DGRAM,用于面向数据报的套接字。”我认为差异可能包括更多内容。
-
你了解stream和packet/message的区别吗?
-
没有写 SOCK_SEQPACKET 总是可靠的,可能不是,你可以丢包
-
非常好。所以它们都按照发送的顺序传递消息,但是 SOCK_SEQPACKET 不能保证可靠,SOCK_DGRAM 也是如此。
标签: c linux sockets unix posix