導航:首頁 > 編程知識 > linux套接字編程recv讀取的長度大於緩沖區時會如何

linux套接字編程recv讀取的長度大於緩沖區時會如何

發布時間:2025-03-11 02:22:03

『壹』 recv/send/recvfrom/sendto/recvmsg/sendmsg小結

總結網路編程中的recv與send:

使用read與write可對套接字進行讀寫,fd為套接字描述符,write復制buf數據至內核TCP緩沖區,具體數據傳輸時間由系統控制。

write阻塞發生在內核發送緩沖區滿時,每個socket具有獨立的接收與發送緩沖區。

在TCP中,recv與send用於精確控制數據傳輸,buf與len指定數據位置與大小,flags提供額外控制。

對於UDP,recvfrom與sendto常用,它們用於無連接通信,讀取數據需獲取發送端地址,寫入數據需指定接收端地址。

recvfrom與sendto的flags與返回值與recv與send相同,用於TCP面向連接socket數據讀寫,使用NULL忽略地址參數。

通用數據讀寫函數通過msghdr結構體實現,包含接收或發送端地址與數據緩沖區。

msg_iov成員定義分散內存塊,msg_iovlen指定塊數量,實現分散讀或集中寫。

msg_control與msg_controllen用於輔助數據傳輸,具體用法可參考《linux高性能伺服器編程》13.9部分。

recvmsg與sendmsg的flags欄位含義與recv與send相同,影響讀寫過程與結果。

『貳』 recv/send/recvfrom/sendto/recvmsg/sendmsg小結

總結網路編程中recv/send與相關系統調用的用法。

使用read和write函數也可進行網路套接字讀寫,寫入後數據暫存於內核TCP發送緩沖區,具體傳輸、接收及處理無保障。

write函數阻塞發生在內核socket發送緩沖區滿時,每個socket擁有獨立的接收與發送緩沖區。

在TCP上下文中,通常使用recv和send函數,send函數接收sockfd上的數據,buf和len參數指定位置和大小,成功返回實際寫入長度,失敗返回-1並設置errno。

flags參數增加額外控制,可取特定選項進行數據傳輸控制。

UDP讀寫採用recvfrom和sendto,recvfrom讀取數據,接收端socket地址需獲取,sendto指定接收端地址。

這兩個系統調用的flags及返回值與send/recv函數類似,recvfrom/sendto用於面向連接socket時,設置最後兩個參數為NULL。

通用數據讀寫函數,適用於TCP和UDP,sockfd指定目標socket,msg參數為msghdr結構體指針。

msghdr結構體包含msg_name、msg_iov、msg_iovlen、msg_control和msg_controllen、msg_flags成員。

msg_name指定通信對方socket地址,msg_iov指定分散內存塊,msg_iovlen指定數量,用於分散讀或集中寫。

msg_control和msg_controllen用於輔助數據傳輸,msg_flags成員繼承recvmsg/sendmsg flags參數,recvmsg結束前更新。

recvmsg與sendmsg函數的flags參數含義與send/recv函數一致。

『叄』 recv函數返回什麼值

recv函數返回其實際的位元組數,如果recv在時出錯,那麼它返回SOCKET_ERROR。如果recv函數在等待協議接收數據時網路中斷了,那麼它返回0。

擴展閱讀,linux recv函數詳解:

1 #include <sys/socket.h>
2 ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);
recv 的前3個參數等同於read函數。

flags參數值為0或:

flags
說明
recv
send

MSG_DONTWAIT
僅本操作非阻塞

MSG_OOB 發送或接收帶外數據

MSG_PEEK
窺看外來消息

MSG_WAITALL
等待所有數據

recv函數解析:

sockfd: 接收端套接字描述符

buff: 用來存放recv函數接收到的數據的緩沖區

nbytes: 指明buff的長度

flags: 一般置為0

1) recv先等待s的發送緩沖區的數據被協議傳送完畢,如果協議在傳送sock的發送緩沖區中的數據時出現網路錯誤,那麼recv函數返回SOCKET_ERROR

2)
如果套接字sockfd的發送緩沖區中沒有數據或者數據被協議成功發送完畢後,recv先檢查套接字sockfd的接收緩沖區,如果sockfd的接收緩
沖區中沒有數據或者協議正在接收數據,那麼recv就一起等待,直到把數據接收完畢。當協議把數據接收完畢,recv函數就把s的接收緩沖區中的數據
到buff中(注意協議接收到的數據可能大於buff的長度,所以在這種情況下要調用幾次recv函數才能把sockfd的接收緩沖區中的數據
完。recv函數僅僅是數據,真正的接收數據是協議來完成的)

3) recv函數返回其實際的位元組數,如果recv在時出錯,那麼它返回SOCKET_ERROR。如果recv函數在等待協議接收數據時網路中斷了,那麼它返回0。

4) 在unix系統下,如果recv函數在等待協議接收數據時網路斷開了,那麼調用 recv的進程會接收到一個SIGPIPE信號,進程對該信號的默認處理是進程終止。

閱讀全文

與linux套接字編程recv讀取的長度大於緩沖區時會如何相關的資料

熱點內容
cdr導出的pdf格式如何文件小點 瀏覽:78
excel表格如何選擇多個數據 瀏覽:342
文件小鐵夾重量是多少 瀏覽:194
js圖片選擇效果 瀏覽:270
ps怎麼改文件上邊的字 瀏覽:243
郵箱里加密文件怎麼轉到桌面 瀏覽:179
查公司的評價是哪個app 瀏覽:991
華為榮耀8切換網路設置 瀏覽:8
u盤視頻插車上顯示無相關文件 瀏覽:283
知乎文件管理軟體 瀏覽:300
xp仿win7工具 瀏覽:772
滴滴司機app怎麼下載不了 瀏覽:444
為什麼總是出現資料庫錯誤 瀏覽:696
計算機愛奇藝視頻文件夾 瀏覽:298
真我安卓app怎麼添加信任 瀏覽:226
aisinoty820安裝教程 瀏覽:948
專科在哪個網站上報志願 瀏覽:865
u盤文件變ink 瀏覽:961
實驗室鋰電池測試哪些數據 瀏覽:967
華為重置密碼是什麼 瀏覽:625

友情鏈接