位置:首頁 > 軟件操作教程 > 編程開發(fā) > C語言 > 問題詳情

C語言 send()函數和recv()函數

提問人:劉團圓發(fā)布時間:2020-12-03

    當服務器與客戶端之間成功建立連接后,可以調用read()和write()函數來實現對套接字的讀寫,以實現網絡中不同主機間的通信。Linux系統(tǒng)還提供了send()和recv()函數,用于實現與read()和write()函數相同的功能。而且send()和recv()的功能要比read()和write()函數更為全面。

(1)send()函數原型如下:

    ssize_t send(int s, const void *buf, size_t len, int flags);

    send()函數用于將信息發(fā)送到指定的套接字文件描述符中。該函數只能用于已經建立連接的socket通信中,即只用于面向連接的通信中。參數s為要發(fā)送數據的套接字文件描述符;buf參數為指向要發(fā)送數據的指針;len為要發(fā)送數據的長度。 

    flag參數可以包含如下參數。

    ? MSG_CONFIRM ( Linux 2.3以上的內核版本支持):通知數據鏈路層發(fā)生了轉發(fā),且得到了通信另一端的回應。如果鏈路層沒有得到回應,將使用ARP或其他協(xié)議來探測網絡上的主機。該參數只用于SOCK_DGRAM和SOCK_RAW類型的套接字。

    ? MSG_DONTROUTE:不通過網關發(fā)送數據,只將數據發(fā)送到同一子網中的計算機。該參數通常用于診斷或路由程序中,只用于路由的協(xié)議族中,套接字不能使用該參數。

    ? MSG_DONTWAIT:使用非阻塞操作。如果操作將阻塞,并返回EAGAIN錯誤。 

    ? MSG.EOR:結束記錄。當套接字類型是SOCK_SEQPACKET時使用。

    ? MSG_MORE ( Linux 2.4_4以上內核版本支持):調用者有更多的數據要發(fā)送。

    ? MSG_OOB: MM套醉發(fā)送帶外套鮮需要支雖一行為,例如使用SOCK—STREAM 類型的套接字。


    write()函數與send()函數在flag為0時的功能相同。 

    send()函數常見的錯誤信息。

    ? EBADF:非法的文件描述。

    ? ECONNRESET:連接重置。

    ? EDESTADDRREQ:套接字操作中沒有指定目標地址。

    ? EFAULT:參數指向了非法的地址空間。

    ? EINTR:數據發(fā)送前,捕獲到信號。

    ? EINVAL:非法參數。

    ? ENOTSOCK:參數非套接字的文件描述符。

    ? ENOMEM:內存不足。

(2)recv()函數可以實現從指定套接字中讀取發(fā)送來的消息,該函數原型如下: 

    ssize_t recv(int s, void *buf, size_t len, int flags);

    recv()函數用于從指定套接字中獲取發(fā)送的消息。與send()函數一樣,該函數只能用于已經建立連接的socket通信中,即只用于面向連接的通信中。參數s為要讀取信息的套接字文件描述符;buf參數為指向要保存數據緩沖區(qū)的指針;而len為該緩存的最大長度。

    參數flags可以包含如下標志。

    ? MSG_DONTWAIT:使用非阻塞操作。如果操作將阻塞,將返回EAGAIN錯誤。 

    ? MSG_OOB:通過套接字發(fā)送帶外數據。套接字需要支持這一行為,例如使用SOCK_STREAM類型的套接字。

    ? MSG_PEEK:該標志表示從接收隊列的開始處查看數據,而不從緩沖區(qū)中刪除數據。

    ? MSG.TRUNC:返回包的真實長度,即使該長度超出了傳遞的緩存長度。該標志只用于流套接字。

    ? MSG.WAITALL:該標志將使得操作處于阻塞狀態(tài),直到獲得全部數據。


    當flags參數為0時,recv()函數的等同于read()函數的功能。 

    recv()函數常見的錯誤信息:

    ? EAGAIN:在接收到數據前,接收操作處于阻塞或直至超時。

    ? EBADF:非法的文件描述符。

    ? ECONNABORTED:遠程主機拒絕網絡連接。 

    ? EFAULT:指向接收數據的緩沖區(qū)指針指向了非法地址空間。

    ? EINTR:系統(tǒng)調用被信號中斷。 

    ? EINVAL:非法參數。

    ? ENOTCONN:套接字使用了面向連接的協(xié)議,但是并沒有建立連接。

    ? ENOTSOCK:文件描述符為文件的文件描述符。

繼續(xù)查找其他問題的答案?

相關視頻回答
回復(0)
返回頂部