使用recv()方法时,有时我们无法接收到所需的数据,就像使用send()一样。但我们可以使用sendall()来解决发送数据的问题,如何接收数据呢?为什么没有这样的recvall()方法?
答案 0 :(得分:6)
没有根本原因可以将这样的功能作为标准库的一部分提供。事实上,有at least one attempt to add recvall()
。
鉴于它可以很容易地实现为recv()
的循环,我认为这不是一个重大遗漏。
答案 1 :(得分:4)
send
包含recv
无法提供的额外信息:要发送的数据量。如果要发送100个字节的数据,sendall
可以客观地确定第一次调用send
时是否发送的字节少于100个,并持续发送数据,直到发送完所有100个字节为止。
当你尝试读取1024个字节但只返回512时,你有没有方式知道是否因为其他512个字节被延迟而你应该尝试阅读更多,或者如果首先只读取512个字节。你永远不能说有更多数据需要阅读,使recvall
无意义。你能做的最多就是决定你愿意等多久(超时)以及你愿意在放弃之前重试多少次。
您可能想知道为什么从文件读取和从套接字读取之间存在明显差异。使用文件,您可以从文件系统获得有关文件中数据量的额外信息,因此您可以可靠地区分EOF和其他可能阻止您读取可用数据的其他信息。套接字没有这样的元数据源。
答案 2 :(得分:0)
因为recvall
基本上是令人困惑的:你的假设是它会准确地读取N个字节,但我认为它会完全耗尽流,基于名称。
由于一系列原因,完全耗尽流的操作是一种危险的API,而且命名的模糊性使得它成为非常低效的API。