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

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

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

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

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

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

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

    flag參數(shù)可以包含如下參數(shù)。

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

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

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

    ? MSG.EOR:結(jié)束記錄。當(dāng)套接字類型是SOCK_SEQPACKET時使用。

    ? MSG_MORE ( Linux 2.4_4以上內(nèi)核版本支持):調(diào)用者有更多的數(shù)據(jù)要發(fā)送。

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


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

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

    ? EBADF:非法的文件描述。

    ? ECONNRESET:連接重置。

    ? EDESTADDRREQ:套接字操作中沒有指定目標(biāo)地址。

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

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

    ? EINVAL:非法參數(shù)。

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

    ? ENOMEM:內(nèi)存不足。

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

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

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

    參數(shù)flags可以包含如下標(biāo)志。

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

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

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

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

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


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

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

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

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

    ? ECONNABORTED:遠(yuǎn)程主機拒絕網(wǎng)絡(luò)連接。 

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

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

    ? EINVAL:非法參數(shù)。

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

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

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

相關(guān)視頻回答
回復(fù)(0)
返回頂部