ssize_t read(int fd, void * data, size_t count);
正好呢?
在网上的很多文章经常被写入,它试图读取或描述符fd。 那是什么意思? “它尝试”:/这样的sockets是如何devise的? 操作系统缓冲进来的消息? 或者是阅读时间关键操作? 我的意思是,如果我不及时“阅读”,是否有一些包裹丢失的可能性?
编辑:
我想了一会儿为什么这不是阻塞。 然后我想知道为什么阅读(…)有其他参数,而不是我在代码片段中看到的所有function。 最后我意识到它被读取 (…)而不是recv (…)。 不幸的是,它仍然按照我的预期工作。 而且,我们怎样才能和我们打成一片。 (不要编辑)我不得不承认德语的例子对读者有更多的影响…
Linux会缓存所有到达连接的TCP套接字的数据,默认情况下高达几兆字节。 数据到达的同时,您不必阅读。
netstat -tn
将显示每个连接套接字的Recv-Q
和Send-Q
,这是每个方向上排队的字节数。
正如Erik Ekman所回答的那样,即使您没有清楚地阅读,系统也会缓冲一些数据。
在缓冲区被越来越多的填充之后,接收者的TCP / IP实现将减少通告的接收窗口大小,导致对端发送更小的数据块,从而有效地抑制了传输。 当缓冲区已满时,窗口大小将降为零,并允许对等体不发送其他数据。 即使发生这种情况,也不会有数据丢失,因为一旦接收缓冲区被清除,对端将恢复发送数据包。
一个正确的TCP / IP实现保证没有数据被跳过丢失 – 一个连接是可靠的和正在工作,或者完全丢失,这是通过read
返回-1来表示的。