2014-01-30 22 views
0

例如在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構建的,它可以在兩者上運行。

此代碼檢測構建時的選項可用性,並且在運行時可能會有所不同。

什麼可能是在運行時檢測的方法?

回答

3

setsockopt呼叫失敗時,您檢查errno以查看出了什麼問題。如果它是EINVALENOPROTOOPT套接字選項是無效的,並且您繼續其他事情。

如果您擔心會發生什麼情況,請先致電getsockopt,如果失敗,請檢查errno

0

getsockoptManpage

用的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 
     (...) 
+0

這只是所有的套接字選項的列表中,OP已經知道SO_REUSEPORT是什麼。在你的評論中的信息是OP的需求 – nos

+0

@nos我認爲他錯誤的關於**的每一行可能會被getsockopt()**檢查,並且它存在於選項中。 – RedX

相關問題