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