recv函式解析

2021-06-10 07:25:01 字數 1448 閱讀 2991

recv函式 i

nt recv( socket s, cha***r *buf, int len, int flags);

不論是客戶還是伺服器應用程式都用recv函式從tcp連線的另一端接收資料。

該函式的第乙個引數指定接收端套接字描述符;

第二個引數指明乙個緩衝區,該緩衝區用來存放recv函式接收到的資料;

第三個引數指明buf的長度;

第四個引數一般置0。

這裡只描述

同步socket

的recv函式的執行流程。當應用程式呼叫recv函式時,

(1)recv先等待s的傳送緩衝中的資料被協議傳送完畢,如果協議在傳送s的傳送緩衝中的資料時出現網路錯誤,那麼recv函式返回socket_error,

(2)如果s的傳送緩衝中沒有資料或者資料被協議成功傳送完畢後,recv先檢查套接字s的接收緩衝區,如果s接收緩衝區中沒有資料或者協議正在接收資料,那麼recv就一直等待,直到協議把資料接收完畢。當協議把資料接收完畢,recv函式就把s的接收緩衝中的資料copy到buf中(

注意協議接收到的資料可能大於buf的長度,所以在這種情況下要呼叫幾次recv函式才能把s的接收緩衝中的資料copy完。

recv函式僅僅是copy資料,真正的接收資料是協議來完成的

),

recv函式返回其實際copy的位元組數。如果recv在copy時出錯,那麼它返回socket_error;如果recv函式在等待協議接收資料時網路中斷了,那麼它返回0。

預設 socket是阻塞的

解阻塞與非阻塞recv返回值沒有區分,都是

<0出錯

=0連線關閉

>0接收到資料大小,

特別:返回值<0時並且(errno ==eintr || errno == ewouldblock || errno ==eagain)的情況下認為連線是正常的,繼續接收。

只是阻塞模式下recv會阻塞著接收資料,非阻塞模式下如果沒有資料會返回,不會阻塞著讀,因此需要迴圈讀取)。

返回說明:

成功執行時,返回接收到的位元組數。另一端已關閉則返回0。失敗返回-1,errno被設為以下的某個值

eagain:套接字已標記為非阻塞,而接收操作被阻塞或者

接收超時

ebadf:sock不是有效的描述詞

econnrefuse:遠端主機阻絕網路連線

efault:記憶體空間訪問出錯

eintr:操作被訊號中斷

einval:引數無效

enomem:記憶體不足

enotconn:與面向連線關聯的套接字尚未被連線上

enotsock:sock索引的不是套接字

當返回值是0時,為正常關閉連線;

Send函式和Recv函式解析

分類 linux網路程式設計 2010 09 20 14 20 3625人閱讀收藏 舉報socket sockets 網路伺服器 unix tcp send函式和recv函式解析 1.send函式 int send socket s,const char far buf,int len,int fl...

Send函式和Recv函式解析

send函式和 recv 函式解析 1.send函式 i nt send socket s,const char far buf,int len,int flags 不論是客戶 端還是伺服器 端應用程式都用send 函式來向 tcp連線的另一端傳送資料。客戶端程式一般用send 函式向伺服器傳送請求...

linux send和recv函式解析

int send socket s,const char far buf,int len,int flags 不論是客戶端還是伺服器端應用程式都用send函式來向tcp連線的另一端傳送資料。客戶端程式一般用send函式向伺服器傳送請求,而伺服器則通常用send函式來向客戶程式傳送應答。該函式的 第乙...