对于STREAM类型和DATAGRAM类型INTERNET套接字之间的区别,这个问题是 NOT 。我知道STREAM套接字使用TCP,Datagram套接字使用UDP和所有TCP,UDP内容,按顺序到达的数据包,ACK,NACK等。 我理解这些在互联网上的重要性。
Q1)当我创建一个本地套接字的UNIX域套接字时,如果套接字是STREAM套接字或DATAGRAM套接字,那将是多么重要。这种类型的套接字会将数据写入套接字文件,在这种情况下协议是否重要,因为我不通过网络传输数据?如果我使用基于UNIX的DATAGRAM套接字,在这种情况下是否有丢失数据的可能性?
Q2)UNIX DATAGRAM套接字是否提供比UNIX STREAM套接字更好的性能?
Q3)如何在我的应用程序中决定基于STREAM / DATAGRAM UNIX的套接字?
感谢
答案 0 :(得分:57)
正如manual page所说,Unix套接字总是可靠的。 SOCK_STREAM
和SOCK_DGRAM
之间的区别在于从套接字中消耗数据的语义。
流套接字允许读取任意数量的字节,但仍保留字节序列。换句话说,发送方可能会向套接字写入4K数据,接收方可以逐字节消耗该数据。反过来也是如此 - 发送者可以将几个小消息写入接收器可以在一次读取中使用的套接字。流套接字不保留消息边界。
另一方面,数据报套接字保留了这些边界 - 发送方的一次写入始终对应于接收方读取的一条(即使接收方的缓冲区给予read(2)
或recv(2)
小于那条消息)。
因此,如果您的应用程序协议包含消息大小已知上限的小消息,那么SOCK_DGRAM
最好使用SOCK_STREAM
,因为这样更容易管理。
如果您的协议要求任意长消息有效负载,或者只是非结构化流(如原始音频或其他内容),请选择{{1}}并执行所需的缓冲。
性能应该是相同的,因为两种类型都只是通过本地内核内存,只是缓冲区管理不同。
答案 1 :(得分:17)
主要区别在于,一个是基于连接(STREAM
),另一个是无连接(DGRAM
) - 区别流和面向分组的通信之间通常不太重要。
使用SOCK_STREAM
,您仍然可以获得所有连接处理,即listen
/ accept
,您可以判断对方是否已关闭连接。
请注意,还有一个SEQPACKET
套接字类型仍然面向连接,但保留了消息边界(这可能会使您无法在STREAM
套接字上实现面向消息的层。)< / p>
我希望所有这些类型的数据传输性能都相似,主要区别在于你想要的语义。
答案 2 :(得分:3)
答案 3 :(得分:0)
如果客户端和服务器始终位于同一台计算机上,并且目标是具有最小延迟和最大带宽,请使用共享内存。