簡體   English   中英

Linux網絡編程。 “閱讀([...])”幕后會發生什么?

[英]Linux network programming. “read([…])” whats going on behind the scenes?

ssize_t read(int fd, void * data, size_t count);什么ssize_t read(int fd, void * data, size_t count); 到底怎么辦?

在網絡上的很多文章中經常寫,它試圖從描述符或讀取器fd。 那是什么意思? “它嘗試”:/這個插座是如何設計的? 操作系統是否緩沖進來的消息? 或者是讀取時間關鍵操作? 我的意思是,如果我沒有及時“閱讀”,是否存在某些包裹丟失的可能性?

編輯:

我想知道為什么這不會阻塞。 然后我想知道為什么read(...)有其他參數而不是我在代碼片段中看到的所有函數。 最后我意識到它被讀取 (...)而不是recv (...)。 不幸的是,它仍然像我預期的那樣工作。 而且我們的ascostaivie如何與我們合作。 (不要編輯)我不得不承認德國的例子對讀者有更大的影響......

Linux將緩沖到達連接的TCP套接字的所有數據,默認情況下最多可達幾兆字節。 您不必在數據到達的同一時間讀取。

netstat -tn將為每個連接的套接字顯示Recv-QSend-Q ,這是每個方向排隊的字節數。

正如Erik Ekman回答的那樣,即使你不能很好地閱讀它,系統也會緩沖一些數據量。

在緩沖區越來越多填充之后,接收方的TCP / IP實現將減少通告的接收窗口大小,從而導致對等方發送較小的數據塊,從而有效地限制傳輸。 當緩沖區已滿時,窗口大小將降至零,並且允許對等方不發送其他數據。 即使發生這種情況,也不會丟失任何數據,因為一旦接收緩沖區被清除,對等體將繼續發送數據包。

正確的TCP / IP實現保證跳過沒有數據丟失 - 連接可靠且工作正常或完全丟失,這由read返回-1表示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM