c - SO_REUSEADDR 似乎保持值 4

标签 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 的 bool 值是否存储为 4?我是否错误地使用了 getsockopt?

最佳答案

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 */

您可能想看看这个:socket.h包含文件。

关于c - SO_REUSEADDR 似乎保持值 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48245896/

相关文章:

Python TCP 套接字 : How to know if a specific connection has sent information

c - 为什么当我在 fork() 之前使用 dup2() 时它不起作用?

c - 如何在 char** 中存储几个单独的字符串以使用 execvp?

c++ - 棘手的 C 问题。动态函数调用

c - 如果计数值大于它可以容纳的值,CPU 计时器如何工作?

C套接字,不完整的文件传输

C:多个 scanf,当我输入一个 scanf 的值时,它会跳过第二个 scanf

C套接字,文件后发送消息,TCP

C++ UDP套接字错误10045

c# - C# 和 Python 中的 int 是一回事吗?