第五十二章、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和recv函數

一般我們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立即返回而不等待。

第五十二章、send和recv函數

第五十二章、send和recv函數


分享到:


相關文章: