C語(yǔ)言 send()函數(shù)和recv()函數(shù)
當(dāng)服務(wù)器與客戶端之間成功建立連接后,可以調(diào)用read()和write()函數(shù)來(lái)實(shí)現(xiàn)對(duì)套接字的讀寫,以實(shí)現(xiàn)網(wǎng)絡(luò)中不同主機(jī)間的通信。Linux系統(tǒng)還提供了send()和recv()函數(shù),用于實(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ù)的長(zhǎng)度。
flag參數(shù)可以包含如下參數(shù)。
? MSG_CONFIRM ( Linux 2.3以上的內(nèi)核版本支持):通知數(shù)據(jù)鏈路層發(fā)生了轉(zhuǎn)發(fā),且得到了通信另一端的回應(yīng)。如果鏈路層沒(méi)有得到回應(yīng),將使用ARP或其他協(xié)議來(lái)探測(cè)網(wǎng)絡(luò)上的主機(jī)。該參數(shù)只用于SOCK_DGRAM和SOCK_RAW類型的套接字。
? MSG_DONTROUTE:不通過(guò)網(wǎng)關(guān)發(fā)送數(shù)據(jù),只將數(shù)據(jù)發(fā)送到同一子網(wǎng)中的計(jì)算機(jī)。該參數(shù)通常用于診斷或路由程序中,只用于路由的協(xié)議族中,套接字不能使用該參數(shù)。
? MSG_DONTWAIT:使用非阻塞操作。如果操作將阻塞,并返回EAGAIN錯(cuò)誤。
? MSG.EOR:結(jié)束記錄。當(dāng)套接字類型是SOCK_SEQPACKET時(shí)使用。
? 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時(shí)的功能相同。
send()函數(shù)常見的錯(cuò)誤信息。
? EBADF:非法的文件描述。
? ECONNRESET:連接重置。
? EDESTADDRREQ:套接字操作中沒(méi)有指定目標(biāo)地址。
? EFAULT:參數(shù)指向了非法的地址空間。
? EINTR:數(shù)據(jù)發(fā)送前,捕獲到信號(hào)。
? EINVAL:非法參數(shù)。
? ENOTSOCK:參數(shù)非套接字的文件描述符。
? ENOMEM:內(nèi)存不足。
(2)recv()函數(shù)可以實(shí)現(xiàn)從指定套接字中讀取發(fā)送來(lái)的消息,該函數(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為該緩存的最大長(zhǎng)度。
參數(shù)flags可以包含如下標(biāo)志。
? MSG_DONTWAIT:使用非阻塞操作。如果操作將阻塞,將返回EAGAIN錯(cuò)誤。
? MSG_OOB:通過(guò)套接字發(fā)送帶外數(shù)據(jù)。套接字需要支持這一行為,例如使用SOCK_STREAM類型的套接字。
? MSG_PEEK:該標(biāo)志表示從接收隊(duì)列的開始處查看數(shù)據(jù),而不從緩沖區(qū)中刪除數(shù)據(jù)。
? MSG.TRUNC:返回包的真實(shí)長(zhǎng)度,即使該長(zhǎng)度超出了傳遞的緩存長(zhǎng)度。該標(biāo)志只用于流套接字。
? MSG.WAITALL:該標(biāo)志將使得操作處于阻塞狀態(tài),直到獲得全部數(shù)據(jù)。
當(dāng)flags參數(shù)為0時(shí),recv()函數(shù)的等同于read()函數(shù)的功能。
recv()函數(shù)常見的錯(cuò)誤信息:
? EAGAIN:在接收到數(shù)據(jù)前,接收操作處于阻塞或直至超時(shí)。
? EBADF:非法的文件描述符。
? ECONNABORTED:遠(yuǎn)程主機(jī)拒絕網(wǎng)絡(luò)連接。
? EFAULT:指向接收數(shù)據(jù)的緩沖區(qū)指針指向了非法地址空間。
? EINTR:系統(tǒng)調(diào)用被信號(hào)中斷。
? EINVAL:非法參數(shù)。
? ENOTCONN:套接字使用了面向連接的協(xié)議,但是并沒(méi)有建立連接。
? ENOTSOCK:文件描述符為文件的文件描述符。
點(diǎn)擊加載更多評(píng)論>>