linux - recv 是否总是返回相同数量的传递给发送的数据?
问题描述
如果我有两个套接字 ( AF_INET
, SOCK_STREAM
, IPPROTO_IPV4
) 连接在一起并且我在一端发出send()
32 字节的 a ,那么在另一端recv()
读取数据的操作是否保证在一次调用中返回相同数量的数据?
解决方案
不,没有这样的保证。实际上,默认情况下,多个连续的短写会组合成一个网络数据包,在一个recv()
. (这被称为Nagle 算法。)
如果您要传输的数据需要以特定方式构建,您将需要包含数据以将该构建定义为您传输的数据的一部分。一种简单的方法是用特殊字符分隔数据,例如换行符或空字节;另一种是在其数据之前传输每帧的长度。(还有许多其他方法来构建数据;这些只是入门的一些想法。)
推荐阅读
- c# - 如何在并行线程中获取当前对象
- angular - 自定义服务呼叫请求不起作用
- c - sleep/nanosleep 是否会导致进程立即放弃剩余的时间片?
- sql - 每个结果多行的 SQL Pivot
- xcode - Bitrise & SPM - 如何使用 Bitrise 构建私有 SPM 依赖项?
- android - 保持片段状态的Android底部导航
- azure-devops - 如何从 azure devops rest api 获得过去 n 个工作项的交互
- c - 使用 Mac 从控制台读取 UTF-8 字符
- spring - JUnit Test 错误地传递了错误的参数
- amazon-web-services - 使用 AWS 网关的 API 版本控制(非 lambda 函数)