【问题标题】:Difference between Unix domain SOCK_DGRAM and SOCK_SEQPACKET?Unix域SOCK_DGRAM和SOCK_SEQPACKET的区别?
【发布时间】: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,用于面向数据报的套接字。”我认为差异可能包括更多内容。
  • 你了解streampacket/message的区别吗?
  • 没有写 SOCK_SEQPACKET 总是可靠的,可能不是,你可以丢包
  • 非常好。所以它们都按照发送的顺序传递消息,但是 SOCK_SEQPACKET 不能保证可靠,SOCK_DGRAM 也是如此。

标签: c linux sockets unix posix


【解决方案1】:

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

在 SOCK_DGRAM 的情况下,您无需创建连接(例如到服务器),您只需将数据包发送到服务器套接字。如果服务器需要回复,您需要创建自己的套接字,让服务器知道这个套接字,然后服务器可以向它发送回复。非常不方便,如果您真的需要连接,但当您只需要单向通信(即发送一些通知)时会很有用。

当您需要面向连接的方法时,SOCK_SEQPACKET 是可行的方法。

【讨论】:

    【解决方案2】:

    借助 UDP 和 TCP 可以更好地理解差异。 像 UDP(无连接)这样的协议使用 SOCK_DGRAM,implementation

    像 TCP(面向连接)这样的协议使用 SOCK_STREAM。但是,甚至可以使用 SOCK_SEQPACKET。两者之间的差异非常小,TCP 也可以使用后者来实现。事实上,SOCK_SEQPACKET 在某种程度上是两者的混合体。 STCP 是 SOCK_SEQPACKET 的一个用例。本文解释:http://urchin.earth.li/~twic/Sequenced_Packets_Over_Ordinary_TCP.html

    这里有一个post,已经详细讨论了这个问题。

    【讨论】:

      猜你喜欢
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 2011-11-28
      • 2011-11-15
      • 2010-09-06
      • 2012-01-27
      相关资源
      最近更新 更多