例如在linux 內核2.6.32-279不/usr/include/asm-generic/socket.h定義SO_REUSEPORT但內核2.6.32-431定義它。如何在運行時檢測SO_REUSEPORT的可用性?
然後,如果我建立一個像一些代碼:
#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;
}
與內核2.6.32-431構建的可執行文件,它與內核2.6.32-431工作正常,但亙古不變的工作,內核2.6 .32-279。 如果它是使用kernel-2.6.32-279構建的,它可以在兩者上運行。
此代碼檢測構建時的選項可用性,並且在運行時可能會有所不同。
什麼可能是在運行時檢測的方法?
這只是所有的套接字選項的列表中,OP已經知道SO_REUSEPORT是什麼。在你的評論中的信息是OP的需求 – nos
@nos我認爲他錯誤的關於**的每一行可能會被getsockopt()**檢查,並且它存在於選項中。 – RedX