我一直在尝试学习使用 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/