引言
一般來說我們使用recv的時候第四個參數都設置爲0,所以纔有了read和recv差不多的說法,那麼第四個參數有什麼用呢?在我遇到這個問題的時候查詢CSDN無果,遂在解決後進行記錄,以幫助有同樣需求的朋友。
正文
第四個參數可以使用0或者以下類型的組合:
MSG_DONTROUTE
:send函數使用,告訴IP協議,目的主機在本地網絡上,不需要查找路由表。MSG_OOB
:可以接收和發送帶外數據,沒記錯的話TCP的數據包中六個標記位中就有這樣一個標記位,即URG。MSG_PEEK
:表示只是從緩衝區讀取內容而不清除緩衝區,也就是說下次讀取還是相同的內容,多進程需要讀取相同數據的時候可以使用。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等。
參考: