簡體   English   中英

與C中的recv()混淆,是否存在底層輸入緩沖區? 數據來自哪里?

[英]Confusion with recv() in C, is there an underlying input buffer? Where is data coming from?

我只是在學習C語言中的套接字/網絡編程,並且遇到了recv()函數導致一些意外行為的情況(至少對我來說是意料之外的)。

我有一個設置套接字的服務器程序,並調用recv()如下所示:

bytes_received = recv(connected, recv_data, 5, 0); 

recv_data是一個5字節的緩沖區。

我的客戶端程序使用send()來發送數據,它的發送緩沖區是1024字節,但是因為它是從標准輸入讀取的,所以在這個實驗期間我只給它1-10個字節(字符)。

我看到即使我的recv()調用使用5字節緩沖區並施加5字節的限制,我仍然可以發送超過5個字節,它似乎只是在服務器端的某個地方排隊,這樣下一次調用recv() (例如在循環中),它接收接下來的5個字節的傳入數據。

我的理解是send()會觸發它的數據(比方說所有12個字節),但由於recv()只是“設置”來處理5個字節,所以最終的7個將會丟失。 服務器從哪里獲取這些? 套接字級是否有一個底層輸入緩沖區, recv()從中彈出數據?

套接字的實現(在內核中)自動為您處理。

只要它是TCP套接字,您就不會丟失數據。 如果它是UDP套接字,如果緩沖區溢出,則可能會丟失數據。

暫無
暫無

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

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