Linux系統調用– recv/recvfrom/recvmsg函數詳解

來源:互聯網
上載者:User
【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]  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.