【recv/recvfrom/recvmsg系統調用】 功能描述:
從通訊端上接收一個訊息。對於recvfrom 和 recvmsg,可同時應用於連線導向的和不需連線的通訊端。recv一般只用在連線導向的通訊端,幾乎等同於recvfrom,只要將recvfrom的第五個參數設定NULL。如果訊息太大,無法完整存放在所提供的緩衝區,根據不同的通訊端,多餘的位元組會丟棄。假如通訊端上沒有訊息可以讀取,除了通訊端已被設定為非阻塞模式,否則接收調用會等待訊息的到來。用法:
#include <sys/types.h>
#include <sys/socket.h>ssize_t recv(int sock, void *buf, size_t len, int flags);ssize_t recvfrom(int sock, void *buf, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen);ssize_t recvmsg(int sock, struct msghdr *msg, int flags);參數:
sock:索引將要從其接收資料的通訊端。
buf:存放訊息接收後的緩衝區。
len:buf所指緩衝區的容量。
flags:是以下一個或者多個標誌的組合體,可通過or操作連在一起MSG_DONTWAIT:操作不會被阻塞。
MSG_ERRQUEUE:
指示應該從通訊端的錯誤隊列上接收錯誤值,依據不同的協議,錯誤值以某種輔佐性訊息的方式傳遞進來,
使用者應該提供足夠大的緩衝區。導致錯誤的原封包通過msg_iovec作為一般的資料來傳遞。導致錯誤的資料報原目標地址作為msg_name被提供。
錯誤以sock_extended_err結構形態被使用,定義如下#define SO_EE_ORIGIN_NONE 0
#define SO_EE_ORIGIN_LOCAL 1
#define SO_EE_ORIGIN_ICMP 2
#define SO_EE_ORIGIN_ICMP6 3struct sock_extended_err
{
u_int32_t ee_errno; /* error number */
u_int8_t ee_origin; /* where the error originated */
u_int8_t ee_type; /* type */
u_int8_t ee_code; /* code */
u_int8_t ee_pad;
u_int32_t ee_info; /* additional information */
u_int32_t ee_data; /* other data */
/* More data may follow */
};MSG_PEEK:指示資料接收後,在接收隊列中保留原資料,不將其刪除,隨後的讀操作還可以接收相同的資料。
MSG_TRUNC:返回封包的實際長度,即使它比所提供的緩衝區更長, 只對packet通訊端有效。
MSG_WAITALL:要求阻塞操作,直到請求得到完整的滿足。然而,如果捕捉到訊號,錯誤或者串連斷開發生,或者下次被接收的資料類型不同,仍會返回少於請求量的資料。
MSG_EOR:指示記錄的結束,返回的資料完成一個記錄。
MSG_TRUNC:指明資料報尾部資料已被丟棄,因為它比所提供的緩衝區需要更多的空間。
MSG_CTRUNC:指明由於緩衝區空間不足,一些控制資料已被丟棄。
MSG_OOB:指示接收到out-of-band資料(即需要優先處理的資料)。
MSG_ERRQUEUE:指示除了來自通訊端錯誤隊列的錯誤外,沒有接收到其它資料。from:指向存放對端地址的地區,如果為NULL,不儲存對端地址。
fromlen:作為入口參數,指向存放表示from最大容量的記憶體單元。作為出口參數,指向存放表示from實際長度的記憶體單元。
msg:指向存放進入訊息頭的記憶體緩衝,結構形態如下struct msghdr {
void *msg_name; /* optional address */
socklen_t msg_namelen; /* size of address */
struct iovec *msg_iov; /* scatter/gather array */
size_t msg_iovlen; /* # elements in msg_iov */
void *msg_control; /* ancillary data, see below */
socklen_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
};可能用到的資料結構有struct cmsghdr {
socklen_t cmsg_len; /* data byte count, including hdr */
int cmsg_level; /* originating protocol */
int cmsg_type; /* protocol-specific type */
/* followed by
u_char cmsg_data[]; */
};返回說明:
成功執行時,返回接收到的位元組數。另一端已關閉則返回0。失敗返回-1,errno被設為以下的某個值
EAGAIN:通訊端已標記為非阻塞,而接收操作被阻塞或者接收逾時
EBADF:sock不是有效描述詞
ECONNREFUSE:遠程主機阻絕網路連接
EFAULT:記憶體空間訪問出錯
EINTR:操作被訊號中斷
EINVAL:參數無效
ENOMEM:記憶體不足
ENOTCONN:與連線導向關聯的通訊端尚未被串連上
ENOTSOCK:sock索引的不是通訊端
摘自:[url]http://club.cn.yahoo.com/bbs/threadview/1200062866_65__pn.html [/url]