recv的第四個參數

引言

一般來說我們使用recv的時候第四個參數都設置爲0,所以纔有了read和recv差不多的說法,那麼第四個參數有什麼用呢?在我遇到這個問題的時候查詢CSDN無果,遂在解決後進行記錄,以幫助有同樣需求的朋友。

正文

第四個參數可以使用0或者以下類型的組合:

  1. MSG_DONTROUTE:send函數使用,告訴IP協議,目的主機在本地網絡上,不需要查找路由表。
  2. MSG_OOB:可以接收和發送帶外數據,沒記錯的話TCP的數據包中六個標記位中就有這樣一個標記位,即URG。
  3. MSG_PEEK:表示只是從緩衝區讀取內容而不清除緩衝區,也就是說下次讀取還是相同的內容,多進程需要讀取相同數據的時候可以使用。
  4. MSG_WAITALL : 表示收到了所有數據的時候才從阻塞中返回,使用這個參數的時候,如果沒有收到的數據沒有達到我們的需求,就會一直阻塞,直到條件滿足。想到了大一寫聊天室接收文件時就用這個參數偷懶的哈哈哈。

我們可以在socket.h中看到一個如下的枚舉體:

enum
  {
    MSG_OOB		= 0x01,	/* Process out-of-band data.  */
#define MSG_OOB		MSG_OOB
    MSG_PEEK		= 0x02,	/* Peek at incoming messages.  */
#define MSG_PEEK	MSG_PEEK
    MSG_DONTROUTE	= 0x04,	/* Don't use local routing.  */
#define MSG_DONTROUTE	MSG_DONTROUTE
#ifdef __USE_GNU
    /* DECnet uses a different name.  */
    MSG_TRYHARD		= MSG_DONTROUTE,
# define MSG_TRYHARD	MSG_DONTROUTE
#endif
    MSG_CTRUNC		= 0x08,	/* Control data lost before delivery.  */
#define MSG_CTRUNC	MSG_CTRUNC
    MSG_PROXY		= 0x10,	/* Supply or ask second address.  */
#define MSG_PROXY	MSG_PROXY
    MSG_TRUNC		= 0x20,
#define MSG_TRUNC	MSG_TRUNC
    MSG_DONTWAIT	= 0x40, /* Nonblocking IO.  */
#define MSG_DONTWAIT	MSG_DONTWAIT
    MSG_EOR		= 0x80, /* End of record.  */
#define MSG_EOR		MSG_EOR
    MSG_WAITALL		= 0x100, /* Wait for a full request.  */
#define MSG_WAITALL	MSG_WAITALL
    MSG_FIN		= 0x200,
#define MSG_FIN		MSG_FIN
    MSG_SYN		= 0x400,
#define MSG_SYN		MSG_SYN
    MSG_CONFIRM		= 0x800, /* Confirm path validity.  */
#define MSG_CONFIRM	MSG_CONFIRM
    MSG_RST		= 0x1000,
#define MSG_RST		MSG_RST
    MSG_ERRQUEUE	= 0x2000, /* Fetch message from error queue.  */
#define MSG_ERRQUEUE	MSG_ERRQUEUE
    MSG_NOSIGNAL	= 0x4000, /* Do not generate SIGPIPE.  */
#define MSG_NOSIGNAL	MSG_NOSIGNAL
    MSG_MORE		= 0x8000,  /* Sender will send more.  */
#define MSG_MORE	MSG_MORE
    MSG_WAITFORONE	= 0x10000, /* Wait for at least one packet to return.*/
#define MSG_WAITFORONE	MSG_WAITFORONE
    MSG_BATCH		= 0x40000, /* sendmmsg: more messages coming.  */
#define MSG_BATCH	MSG_BATCH
    MSG_ZEROCOPY	= 0x4000000, /* Use user data in kernel path.  */
#define MSG_ZEROCOPY	MSG_ZEROCOPY
    MSG_FASTOPEN	= 0x20000000, /* Send data in TCP SYN.  */
#define MSG_FASTOPEN	MSG_FASTOPEN

    MSG_CMSG_CLOEXEC	= 0x40000000	/* Set close_on_exit for file
					   descriptor received through
					   SCM_RIGHTS.  */
#define MSG_CMSG_CLOEXEC MSG_CMSG_CLOEXEC
  };

說實話,文檔確實不多,這裏面很多都很難查到資料,但可以確定不全是用與recv的,有一些用於UDP的recvfrom,sendto的,比如MSG_PROXY,MSG_TRUNC等。

參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章