SO_REUSEADDR似乎保持值4

时间:2018-01-14 01:22:23

标签: c sockets

我一直在尝试使用c来学习套接字编程,我遇到了让我感到困惑的事情。我写了这段代码:

int main(int argc, char *argv[]) {
      int sockfd = socket(AF_INET, SOCK_STREAM, 0);
      int opt = 1;

      if(sockfd == -1) {
              printf("socket error\n");
              exit(EXIT_FAILURE);
      }

      if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
              printf("setsockopt error\n");
              exit(EXIT_FAILURE);
      }

      int getOpt;
      socklen_t  getOptLen = sizeof(getOpt);
      getsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &getOpt, &getOptLen);

      printf("%d\n", getOpt);
 }

我希望它打印一个,因为那是我传递给setsockopt的值,但是它正在打印4. SO_REUSEADDR的布尔值是否存储为4?我是否错误地使用了getsockopt?

2 个答案:

答案 0 :(得分:0)

SO_REUSEADDR的值是布尔值。在C中,布尔值有多个位,如果设置了任何位,则认为是真。也就是说,0表示错误,其他任何表示都是真的。

你得到数字4的事实可能有点奇怪,但只是实施的一个怪癖。您的代码没有任何问题。您不应该使用getOpt的数值而不是检查它是零还是非零。

狂野猜测:实现可能会在一个整数中存储几个布尔套接字选项,其中的映射表明SO_REUSEADDR是第2位(如果设置则为4)。

答案 1 :(得分:0)

SO_REUSEADDR的值为4。或者以十六进制表示(0x0004

#define SO_REUSEADDR    0x0004      /* allow local address reuse */

参见其他一些选项的定义:

/*
 * Option flags per-socket.
 */
#define SO_DEBUG        0x0001      /* turn on debugging info recording */
#define SO_ACCEPTCONN   0x0002      /* socket has had listen() */
#define SO_REUSEADDR    0x0004      /* allow local address reuse */
#define SO_KEEPALIVE    0x0008      /* keep connections alive */
#define SO_DONTROUTE    0x0010      /* just use interface addresses */
#define SO_BROADCAST    0x0020      /* permit sending of broadcast msgs */
#define SO_USELOOPBACK  0x0040      /* bypass hardware when possible */
#define SO_LINGER       0x0080      /* linger on close if data present */
#define SO_OOBINLINE    0x0100      /* leave received OOB data in line */

您可能需要查看以下内容:compiler optimizations包含文件。