gpt4 book ai didi

linux - UNIX 域 STREAM 和 DATAGRAM 套接字之间的区别?

转载 作者:IT老高 更新时间:2023-10-28 12:34:06 45 4
gpt4 key购买 nike

这个问题NOT是关于STREAM类型和DATAGRAM类型INTERNET套接字的区别。我知道 STREAM 套接字使用 TCP,数据报套接字使用 UDP 以及所有 TCP、UDP 内容、按顺序到达的数据包、ACK、NACK 等。我了解这些在互联网上的重要性。

Q1) 当我创建一个本地套接字的 UNIX 域套接字时,该套接字是 STREAM 套接字还是 DATAGRAM 套接字有什么关系。这种类型的套接字会将数据写入套接字文件,在这种情况下协议(protocol)是否重要,因为我没有通过网络传输数据?如果我使用基于 UNIX 的 DATAGRAM 套接字,在这种情况下是否有可能丢失数据?

Q2) UNIX DATAGRAM 套接字是否提供比 UNIX STREAM 套接字更好的性能?

Q3) 如何在我的应用程序中决定使用基于 STREAM/DATAGRAM UNIX 的套接字?


谢谢

最佳答案

就像 manual page说 Unix 套接字总是可靠的。 SOCK_STREAMSOCK_DGRAM 的区别在于从套接字中消费数据的语义。

流套接字允许读取任意数量的字节,但仍保留字节序列。换句话说,发送者可能会向套接字写入 4K 的数据,而接收者可以逐字节地使用该数据。反之亦然——发送方可以将几条小消息写入套接字,接收方可以在一次读取中使用这些消息。流套接字不保留消息边界。

另一方面,数据报套接字确实保留了这些边界 - 发送方的一次写入总是对应于接收方的一次读取(即使给 read(2)recv(2) 的接收方缓冲区小于该消息)。

因此,如果您的应用程序协议(protocol)包含具有已知消息大小上限的小消息,则最好使用 SOCK_DGRAM,因为这样更易于管理。

如果您的协议(protocol)需要任意长的消息负载,或者只是一个非结构化流(如原始音频或其他内容),则选择 SOCK_STREAM 并执行所需的缓冲。

性能应该是相同的,因为这两种类型都只是通过本地内核内存,只是缓冲区管理不同。

关于linux - UNIX 域 STREAM 和 DATAGRAM 套接字之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13953912/

45 4 0