我一直在尝试使用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?
答案 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包含文件。