套接字send和recv中FLAG的含义

use*_*012 4 c sockets linux socketserver

在Linux手册页中进行搜索时,我发现有关套接字中send和recv格式的内容如下:

对于发送,

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
Run Code Online (Sandbox Code Playgroud)

对于revv,

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
Run Code Online (Sandbox Code Playgroud)

但是我不确定他们想说些什么int flags。在一个示例代码中,我发现flag的值为0(零)。这是什么意思?手册页下面的那一行的含义是什么?

"The flags argument is the bitwise OR of zero or more of the following flags."
Run Code Online (Sandbox Code Playgroud)

然后是标志列表:

MSG_CONFIRM
MSG_DONTROUTE
.
.
.
etc.
Run Code Online (Sandbox Code Playgroud)

mac*_*fij 5

如果int flags等于0,则表示未指定任何标志。这些是可选的。
回答有关ORing标志的问题-这是一种允许您指定多个标志的机制- MSG_CONFIRM | MSG_DONTWAIT指定两个标志。

OR gate:          AND gate:

a b  out          a b  out
0 0  0            0 0  0
0 1  1            0 1  0
1 0  1            1 0  0
1 1  1            1 1  1
Run Code Online (Sandbox Code Playgroud)

我了解的是,通过ORing标志,您可以将int变量中的特定位设置为1。
在代码的后面,通过将该变量与特定标志进行“与”运算,您可以知道是否设置了标志。

如果指定了MSG_DONTWAIT标志,则代码: flags & MSG_DONTWAIT将返回1,因此您知道已设置标志。

让我们看看如何定义MSG_DONTWAIT。

enum
  {
    ...
    MSG_DONTWAIT    = 0x40, /* Nonblocking IO.  */
#define MSG_DONTWAIT    MSG_DONTWAIT
    ...
  };
Run Code Online (Sandbox Code Playgroud)

十六进制表示0x40仅将第7位设置为1。

下面我给出了socket.c中按位操作的示例。O_NONBLOCK创建套接字文件描述符时检查是否设置了标志。如果是这样,则将当前标志变量的第7位设置为1(定义为)MSG_DONTWAIT

if (sock->file->f_flags & O_NONBLOCK)
    flags |= MSG_DONTWAIT;
Run Code Online (Sandbox Code Playgroud)

有关按位操作的不错参考:http : //teaching.idallen.com/cst8214/08w/notes/bit_operations.txt