tcp 发送和接收:总是在循环中?

tcp send and recv: always in loops?

发送(或写入)和接收(或读取)to/from TCP 套接字时的最佳做法是什么?

假设在套接字上通常阻塞 I/O。据我了解:

我说得对吗?或者是否有一些“小消息大小”或其他允许在循环外安全读取的条件?

我很困惑,因为我看到了“裸读”的例子,例如在 Tanenbaum-Wetherall 中:

read(sa, buf, BUF_SIZE); /* read file name in socket */

是的,你必须循环接收

我每周回答一次有人的 TCP 应用程序因此而停止工作的问题。真正的杀手锏是他们在同一台机器上开发了客户端和服务器,所以他们得到了环回连接。几乎所有时间,环回都会在发送消息的同一块中接收发送消息。这使得代码看起来是正确的。

真正的挑战在于,这意味着您需要在循环之前知道您将要接收的消息有多大。可能性

  • 首先发送一个固定长度的长度(即你知道它的长度,比如 4 个字节)。
  • 具有可识别的结束序列(如 HTTP 请求末尾的双 crlf。
  • 有固定大小的消息

我总是有一个 'pull the next n bytes' 函数。

写也是要循环的,就这么简单,就是循环的问题