套接字发送和恢复中FLAG的含义

时间:2014-06-26 12:28:45

标签: c linux sockets socketserver

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

发送,

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

对于recv,

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

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

"The flags argument is the bitwise OR of zero or more of the following flags."

然后是标志列表:

MSG_CONFIRM
MSG_DONTROUTE
.
.
.
etc.

3 个答案:

答案 0 :(得分:4)

如果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

我理解的是,通过ORing标志,您可以在int变量中将特定位设置为1。
稍后在代码中,通过对具有特定标志的变量进行AND运算,您知道是否设置了标志。

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

让我们来看看如何定义MSG_DONTWAIT。

enum
  {
    ...
    MSG_DONTWAIT    = 0x40, /* Nonblocking IO.  */
#define MSG_DONTWAIT    MSG_DONTWAIT
    ...
  };

十六进制表示法0x40表示只有第7位设置为1。

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

if (sock->file->f_flags & O_NONBLOCK)
    flags |= MSG_DONTWAIT;

关于按位运算的一个很好的参考:http://teaching.idallen.com/cst8214/08w/notes/bit_operations.txt

答案 1 :(得分:2)

标志允许传递额外行为。默认值(0)将导致默认行为。在大多数简单的情况下,你想要的是什么 如果您希望网络子系统以特定方式运行,您可以通过Oring它们传递标志值或多个值:例如,如果您想拥有' MSG_DONTWAIT'以及' MSG_MORE'行为(如手册页所述)您可以使用MSG_DONTWAIT | MSG_MORE

答案 2 :(得分:2)

Here是一个很好的解释,举个例子。

0标志允许您使用具有标准行为的常规recv()。 如果你想使用自定义recv(),你需要将你的标志(在手册页中列出的那些人)与OR运算符分开,如下所述:

"The flags argument is the bitwise OR of zero or more of the following flags."

就像那样:

recv(sockfd, buf, buflen, FLAG | FLAG | FLAG);