less than 1 minute read

在写webserver的时候,我调用recv()函数的方式如下:

int nread = recv(m_fd, m_buf + m_start, READ_BUFFER_SIZE - m_start - 1, 0);

注意这里长度参数,表示我想嗯读 可能读的最大长度(read buffer满)。

但我依稀记得以前使用read()函数的时候,如果read的长度大于实际到达的数据长度,就会block住。但是recv()的时候我这么写并没有block。

看manpage,recv()的flag为0时不就是一个read()么?为什么recv()不会卡read()会卡?

看了一圈得到的结论是:

  1. 如果fd里没有数据,那么read()和recv()都必卡。
  2. 如果fd里有一些数据,但是指定的长度大于数据,read()和recv()都不会卡,不管是正常文件还是socket。

所以记错了。应该是都不会卡。

Tags:

Categories:

Updated: