sockets - "stream-type"套接字和 "datagram"套接字类型有什么区别?

标签 sockets

“流类型”套接字和“数据报”套接字类型有什么区别?

最佳答案

简短的回答:消息边界和连接。

使用流套接字,您可以写入两条 5 字节消息并最终读取一条 10 字节消息。这是因为您写入的数据只是放入单个流中,写入的数据之间没有边界。这就像一次向文件写入一个单词一样。作为文件的阅读者,您如何知道作者最初是否一次向文件写入一个字符、一次一个单词、一次一句话、一次一段或一次写入整个文件?基本上,如果文件已经写入,则不需要。对于流,如果发送是快速连续完成的,您如何知道源发送了两条 5 字节消息或一条 10 字节消息?您必须有某种长度或分隔符来帮助指示消息边界。有时您不关心消息或其边界。其他时候,您添加应用程序级数据(例如 header 、分隔符、预定义的消息长度等)。这使得流套接字也可用,因为您自己处理消息传递(即在应用程序层)。

使用基于数据报的套接字,接收方知道发送方发送的消息的大小,因为它们以 1:1 的比例传送(避免丢失、重复等...),并保留其原始大小。

除此之外,基于流的套接字往往是面向连接的和 1:1,而数据报套接字是无连接的,并且可能是一对(源)对多(接收者),具有广播/多播。

关于sockets - "stream-type"套接字和 "datagram"套接字类型有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4004352/

相关文章:

java - 在java中写入python套接字服务器

c - 绑定(bind)到两个本地 IP 失败

Java Server 关闭后向客户端发送消息

python - 如何在python中使用s.send发送多个整数值

c - 当数据从套接字传入时如何将数据打印到终端

sockets - TCP套接字的传输时间

ruby - 如何从外部停止udp_server_loop

c++ - ZeroMQ 无法通过单播 IPv6 工作

sockets - 将多播目标地址设置为FFFF.FFFF.FFFF可以使其成为广播吗?

在 Ubuntu 上使用 TCP_REPAIR 套接字选项编译代码