我想减少TCP服务器的延迟。所以我读到了,并使用了TCP_NODELAY。大!整体延迟有点下降!现在我想我也可以在阅读时减少延迟。但我不太了解TCP堆栈的行为。例如,如果发送方发送的数据包只有25个字节,那么接收方的下列代码会发生什么?
BUFFER_SIZE = 4096
char buffer[BUFFER_SIZE];
received = read (common_socket, buffer, BUFFER_SIZE);
我的特殊问题是,如果socket是阻塞的,那么read的调用会返回吗?在从读取调用返回之前,TCP是否会等待更多数据到达是否存在任何情况?
答案 0 :(得分:1)
read是一个阻塞调用,这意味着它将在读取行阻塞,直到你收到一些东西。
如果收到的缓冲区大小小于缓冲区大小,则将转到下一个操作,“received”变量将保存已读取的字节数。
参考: http://man7.org/linux/man-pages/man2/read.2.html
成功时,返回读取的字节数(零表示结束 (文件),文件位置按此编号前进。它是 如果此数字小于字节数,则不会出错 要求;这可能发生在例如因为更少的字节 实际上现在可用(也许是因为我们接近结束了 文件,或者因为我们正在从管道或终端读取),或者 因为read()被信号打断了。出错,-1是 返回,并正确设置errno。在这种情况下,它是左 未指定文件位置(如果有)是否发生变化。
答案 1 :(得分:1)
如果socket是阻塞的,那么read的调用会返回吗?
如果套接字接收缓冲区或挂起的流结束或错误中有数据,它将立即返回,否则它将阻塞一次,直到出现其中一个条件。
在读取呼叫返回之前,TCP是否会等待更多数据到达是否有任何情况?
没有