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函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: q87主板支持cpu型号_怎么选内存,看
- 下一篇: 键盘映射软件_KOMPLETE KONT