首页 > 解决方案 > recv 是否总是返回相同数量的传递给发送的数据?

问题描述

如果我有两个套接字 ( AF_INET, SOCK_STREAM, IPPROTO_IPV4) 连接在一起并且我在一端发出send()32 字节的 a ,那么在另一端recv()读取数据的操作是否保证在一次调用中返回相同数量的数据?

标签: linuxsocketstcp

解决方案


不,没有这样的保证。实际上,默认情况下,多个连续的短写会组合成一个网络数据包,在一个recv(). (这被称为Nagle 算法。)

如果您要传输的数据需要以特定方式构建,您将需要包含数据以将该构建定义为您传输的数据的一部分。一种简单的方法是用特殊字符分隔数据,例如换行符或空字节;另一种是在其数据之前传输每帧的长度。(还有许多其他方法来构建数据;这些只是入门的一些想法。)


推荐阅读