日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

recv函数_第五十二章、send和recv函数

發布時間:2025/3/13 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 recv函数_第五十二章、send和recv函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

套接字之間一旦建立了連接,那么就可以傳送數據了,上一章我們使用的是標準讀寫函數read和write,這一章我們再來學習另外兩個函數recv和send函數。

recv和send函數只能用于套接字,還需要有參數指明控制套接字特殊傳輸方式的各種標志。

我們先來看看他們的定義:

ssize_t recv (int __fd, void *__buf, size_t __n, int __flags)

ssize_t send (int __fd, const void *__buf, size_t __n, int __flags)

這兩個函數的前三個參數和read和write函數的參數一樣,第四個參數flags指明消息傳送的類型,它的值可以為0,這時與read和write函數等價,也可以使用下圖中的傳送標志:

一般我們send函數常用MSG_OOB(帶外數據),MSG_DONTROUTE(不包含本地路由信息),recv函數常用MSG_OOB、MSG_PEEK(監視套接字上的數據而不實際讀出他們)、MSG_WAITALL(請求函數阻塞直至所請求的全部數據都已接收到,不過在出現信號問題,連接被中斷,或者指明了MSG_PEEK或者套接字出錯的情況,盡管指明了MSG_WAITAL標志,recv接收到的數據仍然可能小于要求的數據大小)

帶外數據是流套接字特有的。在流套接字上傳送數據時,數據按他們寫出的順序傳送。

因為接收進程必須依次讀取套接字上的當前數據,因此,當出現一個緊急情況時,沒有辦法立即通知接收進程。帶外數據正用于解決這一問題。帶外數據在正常的數據流之外發送,其效果相當于越過套接字上所有等待讀的數據。當它到達接收進程時,接收進程會收到一個信號,從而進程可以立即處理這個數據。

send函數調用成功返回實際傳送字節個數,失敗時返回-1,注意:一個成功的返回值僅僅指出已正確地將消息發送出去而已,并不一定意味著該消息已正確地被接收,返回值為-1僅指出本地檢測到的錯誤。

recv函數調用成功返回讀到的buff所指向的緩沖區中的數據的字節長度;如果沒有消息可接收并且對等套接字已執行了shutdown,將返回0,否則返回-1.

send和recv函數都是阻塞的,如果套接字不能立即傳送數據,send將等待直至數據被傳送完之后才返回;如果在套接字上沒有可讀的消息,recv將等待直至有消息到達,當套接字設置了非阻塞標志O_NONBLOCK且沒有數據可讀時,recv立即返回而不等待。

總結

以上是生活随笔為你收集整理的recv函数_第五十二章、send和recv函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。