读取时的TCP缓冲

时间:2015-07-20 08:03:52

标签: sockets tcp

我想减少TCP服务器的延迟。所以我读到了,并使用了TCP_NODELAY。大!整体延迟有点下降!现在我想我也可以在阅读时减少延迟。但我不太了解TCP堆栈的行为。例如,如果发送方发送的数据包只有25个字节,那么接收方的下列代码会发生什么?

BUFFER_SIZE = 4096
char buffer[BUFFER_SIZE];
received = read (common_socket, buffer, BUFFER_SIZE);

我的特殊问题是,如果socket是阻塞的,那么read的调用会返回吗?在从读取调用返回之前,TCP是否会等待更多数据到达是否存在任何情况?

2 个答案:

答案 0 :(得分:1)

read是一个阻塞调用,这意味着它将在读取行阻塞,直到你收到一些东西。

如果收到的缓冲区大小小于缓冲区大小,则将转到下一个操作,“received”变量将保存已读取的字节数。

参考: http://man7.org/linux/man-pages/man2/read.2.html

  

成功时,返回读取的字节数(零表示结束   (文件),文件位置按此编号前进。它是   如果此数字小于字节数,则不会出错   要求;这可能发生在例如因为更少的字节   实际上现在可用(也许是因为我们接近结束了   文件,或者因为我们正在从管道或终端读取),或者   因为read()被信号打断了。出错,-1是   返回,并正确设置errno。在这种情况下,它是左   未指定文件位置(如果有)是否发生变化。

答案 1 :(得分:1)

  

如果socket是阻塞的,那么read的调用会返回吗?

如果套接字接收缓冲区或挂起的流结束或错误中有数据,它将立即返回,否则它将阻塞一次,直到出现其中一个条件。

  

在读取呼叫返回之前,TCP是否会等待更多数据到达是否有任何情况?

没有