1. 程式人生 > >recv、recvfrom、recvmsg函式

recv、recvfrom、recvmsg函式

轉載地址:https://blog.csdn.net/jiahehao/article/details/8858131

1. recv

#include <sys/socket.h>
ssize_t recv(int sockfd, void * buf, size_t nbytes, int flags);
返回值:已位元組計數的訊息長度,若無可用訊息或者對方已經按序結束則返回0,出錯返回-1
flag有以下值:
MSG_OOB:     如果協議支援,接收帶外資料
MSG_PEER:    返回報文內容而不是真正取走報文
MSG_TRUNC:   即使報文被截斷,要求返回的是報文的實際長度
MSG_MAITALL: 等待直到所有資料可用(僅支援SOCK_STREAM)
對於SOCK_STREAM套接字,接收的資料可以比請求的少,標誌MSG_WAITALL可以阻止這種行文,除非所需資料全部收到,recv函式才返回。對於SOCK_DGRAM和SOCK_SEQPACKET套接字,MSG_WAITALL標誌沒有什麼影響,因為這些基於報文的套接字型別一次讀取就返回整個報文。
如果傳送者已經呼叫了shutdown來結束傳輸,或者網路協議支援預設的順序關閉且傳送端已經關閉,那麼所有的資料接收完畢後,recv返回0。

2. recvform



如果要定位資料傳送者,可以使用recvfrom來得到資料傳送者的源地址
#include <sys/socket.h>
ssize_t recvfrom(int sockfd,  //套接字
                 void * buf,  //接收資料緩衝區
                 size_t len,  //接收資料長度
                 int flags,   //標誌
                 struct sockaddr * addr, //資料傳送者地址,函式呼叫後該地址結構被填充
                 socklen_t * addrlen  //地址長度指標(注意這裡是個指標)
                 );
返回值:以位元組計數的訊息長度,若無可用訊息或對方已經按序結束則返回0,出錯返回-1.

如果addr非空,他將包含資料傳送者的套接字地址,當呼叫recvfrom時,需要設定addrlen引數指向一個包含addr所指套接字緩衝區位元組大小的整數。返回時,該整數設為該地址的實際位元組大小。
因為可以獲得傳送者的地址,recvfrom通常用於無連線套接字。否則recvfrom等同於recv。

3. recvmsg


recvmsg將接收到的資料送入多個緩衝區,或者想接收輔助資料
#include <sys/socket.h>
ssize_t recvmsg(int sockfd, struct msghdr * msg, int flag);
返回值:以位元組計數的訊息長度,若無可用訊息或對方已經按序結束則返回0,出錯返回-1.

結構msghdr被recvfrom用於指定接收資料的輸入緩衝區。可以設定引數flags來改變recvfrom的預設行文。