tcp 发送和接收:总是在循环中?
tcp send and recv: always in loops?
发送(或写入)和接收(或读取)to/from TCP 套接字时的最佳做法是什么?
假设在套接字上通常阻塞 I/O。据我了解:
- 写入(发送)没有循环应该没问题,因为如果套接字的写入缓冲区已满,它会阻塞,所以像
if ((nbytes_w = write(sock, buf, nb)) < nb)
/* something bad happened : error or interrupted by signal */
应该总是正确的?
- 另一方面,不能保证一定会阅读完整的消息,因此应该阅读
while ((nbytes_r = read(sock, buf, MAX)) > 0) {
/* do something with these bytes */
/* break if encounter specific application protocol end of message flag
or total number of bytes was known from previous message
and/or application protocol header */
}
我说得对吗?或者是否有一些“小消息大小”或其他允许在循环外安全读取的条件?
我很困惑,因为我看到了“裸读”的例子,例如在 Tanenbaum-Wetherall 中:
read(sa, buf, BUF_SIZE); /* read file name in socket */
是的,你必须循环接收
我每周回答一次有人的 TCP 应用程序因此而停止工作的问题。真正的杀手锏是他们在同一台机器上开发了客户端和服务器,所以他们得到了环回连接。几乎所有时间,环回都会在发送消息的同一块中接收发送消息。这使得代码看起来是正确的。
真正的挑战在于,这意味着您需要在循环之前知道您将要接收的消息有多大。可能性
- 首先发送一个固定长度的长度(即你知道它的长度,比如 4 个字节)。
- 具有可识别的结束序列(如 HTTP 请求末尾的双 crlf。
- 有固定大小的消息
我总是有一个 'pull the next n bytes' 函数。
写也是要循环的,就这么简单,就是循环的问题
发送(或写入)和接收(或读取)to/from TCP 套接字时的最佳做法是什么?
假设在套接字上通常阻塞 I/O。据我了解:
- 写入(发送)没有循环应该没问题,因为如果套接字的写入缓冲区已满,它会阻塞,所以像
应该总是正确的?if ((nbytes_w = write(sock, buf, nb)) < nb) /* something bad happened : error or interrupted by signal */
- 另一方面,不能保证一定会阅读完整的消息,因此应该阅读
while ((nbytes_r = read(sock, buf, MAX)) > 0) { /* do something with these bytes */ /* break if encounter specific application protocol end of message flag or total number of bytes was known from previous message and/or application protocol header */ }
我说得对吗?或者是否有一些“小消息大小”或其他允许在循环外安全读取的条件?
我很困惑,因为我看到了“裸读”的例子,例如在 Tanenbaum-Wetherall 中:
read(sa, buf, BUF_SIZE); /* read file name in socket */
是的,你必须循环接收
我每周回答一次有人的 TCP 应用程序因此而停止工作的问题。真正的杀手锏是他们在同一台机器上开发了客户端和服务器,所以他们得到了环回连接。几乎所有时间,环回都会在发送消息的同一块中接收发送消息。这使得代码看起来是正确的。
真正的挑战在于,这意味着您需要在循环之前知道您将要接收的消息有多大。可能性
- 首先发送一个固定长度的长度(即你知道它的长度,比如 4 个字节)。
- 具有可识别的结束序列(如 HTTP 请求末尾的双 crlf。
- 有固定大小的消息
我总是有一个 'pull the next n bytes' 函数。
写也是要循环的,就这么简单,就是循环的问题