C 如何在运行时检测SO_重用端口的可用性?
例如,linux kernel-2.6.32-279没有在/usr/include/asm generic/socket.h中定义SO_REUSEPORT,但kernel-2.6.32-431定义了它 然后,如果我构建一些代码,如:C 如何在运行时检测SO_重用端口的可用性?,c,linux,sockets,linux-kernel,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_
#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;
}
#包括
#包括
int createsock()
{
int sock=插座(AF INET,sock DGRAM,0);
#ifdef SO_重用端口
int=1;
if(setsockopt(sock,SOL_SOCKET,SO_REUSEPORT,(const char*)和reuse,sizeof(reuse))<0)
{
关闭(袜子);
返回-1;
}
#恩迪夫
返回袜子;
}
该可执行文件是使用kernel-2.6.32-431构建的,它可以正确地使用kernel-2.6.32-431,但不能使用kernel-2.6.32-279。
如果它是用kernel-2.6.32-279构建的,那么它在这两个版本上都可以工作
这段代码在构建时检测选项的可用性,在运行时可能会有所不同
运行时检测的方法是什么?当调用失败时,您可以检查出什么地方出了问题。如果是EINVAL
或enprotoop
套接字选项无效,您可以继续执行其他操作
如果您担心可能会发生什么事情,请先打电话,检查errno
,如果失败,也要以同样的方式检查。当电话失败时,您要检查出了什么问题。如果是EINVAL
或enprotoop
套接字选项无效,您可以继续执行其他操作
如果您担心可能会发生什么事情,请先打电话,检查errno
,如果失败,也要以同样的方式检查。当电话失败时,您要检查出了什么问题。如果是EINVAL
或enprotoop
套接字选项无效,您可以继续执行其他操作
如果您担心可能会发生什么事情,请先打电话,检查errno
,如果失败,也要以同样的方式检查。当电话失败时,您要检查出了什么问题。如果是EINVAL
或enprotoop
套接字选项无效,您可以继续执行其他操作
如果您担心可能会发生什么事情,请先打电话,检查
errno
,如果失败,同样检查方法。那么getsockopt
呢
使用getsockopt,您可以检查[enProtoop]的返回代码,该选项在所示级别未知。不触及选项
从手册页:
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
(...)
那么getsockopt
呢
使用getsockopt,您可以检查[enProtoop]的返回代码,该选项在所示级别未知。不触及选项
从手册页:
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
(...)
那么getsockopt
呢
使用getsockopt,您可以检查[enProtoop]的返回代码,该选项在所示级别未知。不触及选项
从手册页:
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
(...)
那么getsockopt
呢
使用getsockopt,您可以检查[enProtoop]的返回代码,该选项在所示级别未知。不触及选项
从手册页:
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
(...)
这只是所有套接字选项的列表,OP已经知道SO_REUSEPORT是什么。你的评论中的信息是OPneeds@nos我认为他没有注意到每一行都可以用getsockopt()检查,并且它存在于选项中。这只是所有套接字选项的列表,OP已经知道什么是sou REUSEPORT。你的评论中的信息是OPneeds@nos我认为他没有注意到每一行都可以用getsockopt()检查,并且它存在于选项中。这只是所有套接字选项的列表,OP已经知道什么是sou REUSEPORT。你的评论中的信息是OPneeds@nos我认为他没有注意到每一行都可以用getsockopt()检查,并且它存在于选项中。这只是所有套接字选项的列表,OP已经知道什么是sou REUSEPORT。你的评论中的信息是OPneeds@nos我认为他错过了每一行可以用getsockopt()检查的内容,并且它存在于选项中。