对于流类型和数据报类型的INTERNET套接字之间的差异,这个问题不是.我知道流套接字使用TCP,数据报套接字使用UDP以及所有TCP、UDP内容、按顺序到达的数据包、ACK、NACK等.

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


Thanks

推荐答案

正如manual page所说,Unix套接字总是可靠的.SOCK_STREAMSOCK_DGRAM之间的区别在于从套接字中消费数据的语义.

流套接字允许读取任意数量的字节,但仍保留字节序列.换句话说,发送方可能会向套接字写入4K数据,接收方可以逐个字节地使用这些数据.另一种方法也是如此——发送方可以将几个小消息写入套接字,接收方可以在一次读取中使用这些消息.流套接字不保留消息边界.

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

因此,如果应用程序协议中的小消息大小上限已知,那么最好使用SOCK_DGRAM,因为这样更容易管理.

如果您的协议需要任意长消息有效负载,或者只是一个非 struct 化流(如原始音频或其他),那么 Select SOCK_STREAM并执行所需的缓冲.

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

Linux相关问答推荐

是否可以在Bash正则表达式中排除?

AWK打印到文件正在追加,而不是覆盖

将十六进制文件名转换为十进制

使用 bash 命令将文件从子文件夹复制到另一个

将 Visual Studio C++ 项目迁移到 Linux 和 CMake

在 bash 中获取目录或文件的基本名称的快速且正确的方法

我可以阅读 Linux 内核的哪些部分以获得乐趣?

如何在 Ubuntu 上安装 chkconfig?

安装 mod_ssl 亚马逊 Linux

如何在 Linux 中使用命令行将 PDF 转换为 JPG?

何时判断 EINTR 并重复函数调用?

如果关键字触发然后执行命令,Shell 脚本来监视日志(log)文件?

以原子方式移动目录

vscode 总是请求保存权限

限制程序在 Linux 中运行的时间

用于提取 IP 地址的 Linux bash 脚本

ldconfig 错误:使用 Linux 加载程序时不是符号链接

如何在 IE 中使用 Linux 进行测试

如何使用mv命令移动特定目录中的文件除外?

svn over HTTP 代理