例如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构建的,那么它适用于两者。
此代码在构建时检测选项可用性,并且在运行时可能会有所不同。
什么是在运行时检测的方法?
答案 0 :(得分:3)
当setsockopt
调用失败时,您会检查errno
以查看出现了什么问题。如果它是EINVAL
或ENOPROTOOPT
套接字选项无效,您继续使用其他内容。
如果您担心可能会发生某些事情,请先致电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
(...)