Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在运行时检测SO_重用端口的可用性?_C_Linux_Sockets_Linux Kernel - Fatal编程技术网

C 如何在运行时检测SO_重用端口的可用性?

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_

例如,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;
}
#包括
#包括
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()检查的内容,并且它存在于选项中。