对于流类型和数据报类型的INTERNET套接字之间的差异,这个问题不是.我知道流套接字使用TCP,数据报套接字使用UDP以及所有TCP、UDP内容、按顺序到达的数据包、ACK、NACK等.
问题1)当我创建一个UNIX域套接字(它是本地套接字)时,该套接字是流套接字还是数据报套接字有什么关系.这种类型的套接字会将数据写入套接字文件,在这种情况下,协议是否重要,因为我没有通过网络传输数据?如果我使用基于UNIX的数据报套接字,在这种情况下是否有数据丢失的可能性?
Thanks
对于流类型和数据报类型的INTERNET套接字之间的差异,这个问题不是.我知道流套接字使用TCP,数据报套接字使用UDP以及所有TCP、UDP内容、按顺序到达的数据包、ACK、NACK等.
问题1)当我创建一个UNIX域套接字(它是本地套接字)时,该套接字是流套接字还是数据报套接字有什么关系.这种类型的套接字会将数据写入套接字文件,在这种情况下,协议是否重要,因为我没有通过网络传输数据?如果我使用基于UNIX的数据报套接字,在这种情况下是否有数据丢失的可能性?
Thanks
正如manual page所说,Unix套接字总是可靠的.SOCK_STREAM
和SOCK_DGRAM
之间的区别在于从套接字中消费数据的语义.
流套接字允许读取任意数量的字节,但仍保留字节序列.换句话说,发送方可能会向套接字写入4K数据,接收方可以逐个字节地使用这些数据.另一种方法也是如此——发送方可以将几个小消息写入套接字,接收方可以在一次读取中使用这些消息.流套接字不保留消息边界.
另一方面,数据报套接字确实保留了这些边界——发送方的一次写入总是对应于接收方的一次读取(即使接收方提供给read(2)
或recv(2)
的缓冲区小于该消息).
因此,如果应用程序协议中的小消息大小上限已知,那么最好使用SOCK_DGRAM
,因为这样更容易管理.
如果您的协议需要任意长消息有效负载,或者只是一个非 struct 化流(如原始音频或其他),那么 Select SOCK_STREAM
并执行所需的缓冲.
性能应该是相同的,因为这两种类型只是通过内核内存中的本地内存,只是缓冲区管理不同.