如何在运行时检测SO_REUSEPORT是否可用?

时间:2014-01-30 11:13:51

标签: c linux sockets linux-kernel

例如linux kernel-2.6.32-279 没有在/usr/include/asm-generic/socket.h中定义SO_REUSEPORT但是 kernel-2.6.32-431 定义它。

然后,如果我构建一些代码,如:

#include <sys/socket.h>
#include <unistd.h>

int createsock()
{
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
#ifdef SO_REUSEPORT
    int reuse = 1;
    if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT,(const char*)&reuse, sizeof(reuse)) < 0) 
    {
        close(sock);
        return -1;
    }
#endif
    return sock;
}

使用kernel-2.6.32-431构建的可执行文件,它与kernel-2.6.32-431一起正常工作,但不适用于kernel-2.6.32-279。 如果它是使用kernel-2.6.32-279构建的,那么它适用于两者。

此代码在构建时检测选项可用性,并且在运行时可能会有所不同。

什么是在运行时检测的方法?

2 个答案:

答案 0 :(得分:3)

setsockopt调用失败时,您会检查errno以查看出现了什么问题。如果它是EINVALENOPROTOOPT套接字选项无效,您继续使用其他内容。

如果您担心可能会发生某些事情,请先致电getsockopt,如果失败,请同样检查errno

答案 1 :(得分:0)

getsockopt怎么样? Manpage

使用getsockopt,您可以检查[ENOPROTOOPT] The option is unknown at the level indicated的返回码。没有触及选项。

从联系手册:

The following options are recognized at the socket level.  Except as
noted, **each may be examined with getsockopt()** and set with setsockopt().

       (...)
       SO_REUSEPORT    enables duplicate address and port bindings
       (...)
相关问题