在Unix網絡編程中通常用到getsockopt和setsockopt兩個函數來獲取和設置套接口的選項。
getsockopt()函數用於獲取任意類型、任意狀態套接口的選項當前值,並把結果存入optval。
1 #include <sys/socket.h> 2 int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); 3 /* 4 sockfd:一個標識套接口的描述字。 5 level:選項定義的層次。例如,支持的層次有SOL_SOCKET、IPPROTO_TCP等。 6 optname:需獲取的套接口選項。 7 optval:指針,指向存放所獲得選項值的緩沖區。 8 optlen:指針,指向optval緩沖區的長度值。 9 */
setsockopt()函數用於任意類型、任意狀態套接口的設置選項值。盡管在不同協議層上存在選項,但本函數僅定義了最高的“套接口”層次上的選項。
1 #include <sys/socket.h> 2 int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); 3 /* 4 sockfd:標識一個套接口的描述字。 5 level:選項定義的層次;支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6等。 6 optname:需設置的選項。 7 optval:指針,指向存放選項值的緩沖區。 8 optlen:optval緩沖區長度。 9 */
以上兩個函數僅用於套接口,sockfd必須指向一個打開的套接口, level指定系統中解釋選項的代碼,普通套接口代碼或特定於協議的代碼(例如:IPv4、IPv6或TCP)。
optval是一個指向變量的指針,通過它,或由setsockopt取得選項的新值,或由getsockopt存儲選項的當前值。此變量的大小由最后一個參數指定,對於setsockopt,它是一個值,對getsockopt來說,它是一個出參。
下表總結了由getsockopt獲取或由setsockopt設置的一些選項,“數據類型”列給出了指針optval必須指向的每個選項的數據類型。其中,用花括號的標記來表示一個結構,如linger{}表示結構linger。
level級別:SOL_SOCKET | ||||||||||||||||
optname(選項名) |
選項值數據類型 |
訪問 |
說明 |
|||||||||||||
SO_ACCEPTCONN |
bool |
get |
如為TRUE(真) ,表明套接字處於監聽模式 |
|||||||||||||
SO_BROADCAST |
bool |
get/set |
如TRUE,表明套接字已配置成對廣播消息進行發送 |
|||||||||||||
SO_CONNECT_TIME |
int |
get |
返回套接字建立連接的時間,以秒為單位,如尚未連接,返回0xffffffff |
|||||||||||||
SO_DEBUG |
bool |
get/set |
如果TRUE,就允許調試輸出 (W32不支持) |
|||||||||||||
SO_DONTLINGER |
bool |
get/set |
如果是TRUE,則禁用SO_LINGER |
|||||||||||||
SO_LINGER |
struct linger |
get/set |
設置或獲取當前的拖延值 |
|||||||||||||
SO_DONTROUTE |
bool |
get/set |
如果TRUE,便直接向網絡接口發送消息,毋需查詢路由表 |
|||||||||||||
SO_ERROR |
bool |
get |
返回錯誤狀態 |
|||||||||||||
SO_EXCLUSIVEADDRUSE |
bool |
get/set |
如果TRUE,套接字綁定那個本地端口就不能重新被另一個進程使用 |
|||||||||||||
SO_KEEPALIVE |
bool |
get/set |
如果TRUE,套接字就會進行配置,在會話過程中發送”保持活動”消息 |
|||||||||||||
SO_MAX_MSG_SIZE |
unsigned int |
get |
對一個面向消息的套接字來說,一條消息的最大長度 |
|||||||||||||
SO_OOBINLINE |
bool |
get/set |
如果是TRUE,帶外數據就會在普通數據流中返回 (W32不支持) |
|||||||||||||
SO_PROTOCOL_INFO |
WSAPROTOCOL_INFO |
get |
套接字綁定的那種協議的特征 |
|||||||||||||
SO_RCVBUF |
int |
get/set |
面向接收操作,為每個套接字分別獲取或設置緩沖區長度 |
|||||||||||||
SO_REUSEADDR |
bool |
get/set |
如果是TRUE,套接字就可與一個正由其他套接字使用的地址綁定到一起,或與處在TIME_WAIT狀態的地址綁定到一起 |
|||||||||||||
SO_SNDBUF |
bool |
get/set |
設置分配給套接字的數據發送緩沖區的大小 |
|||||||||||||
SO_TYPE |
int |
get |
返回指定套接字的類型(如SOCK_DGRAM和SOCK_STREAM等等) |
|||||||||||||
SO_SNDTIMEO |
int |
get/set |
獲取或設置套接字上的數據發送超時時間(以毫秒為單位) |
|||||||||||||
SO_RCVTIMEO |
int |
get/set |
獲取或設置與套接字上數據接收對應的超時時間值(以毫秒為單位) |
|||||||||||||
SO_UPDATE_ACCEPT_CONTEXT |
SOCKET |
get/set |
更新SOCKET狀態 |
|||||||||||||
level級別:IPPROTO_IP | ||||||||||||||||
optname(選項名) |
選項值數據類型 |
訪問 |
說明 |
|||||||||||||
IP_OPTIONS |
char[] |
get/set |
設置或獲取IP頭內的IP選項 |
|||||||||||||
IP_HDRINCL |
bool |
get/set |
如果是TRUE,IP頭就會隨即將發送的數據一起提交,並從讀取的數據中返回 |
|||||||||||||
IP_TOS |
int |
get/set |
IP服務類型 |
|||||||||||||
IP_TTL |
int |
get/set |
IP協議的“存在時間” (TTL) |
|||||||||||||
IP_MULTICAST_IF |
unsigned long |
get/set |
獲取或設置打算從它上面發出多播數據的本地接口 |
|||||||||||||
IP_MULTICAST_TTL |
int |
get/set |
為套接字獲取或設置多播數據包的存在時間 |
|||||||||||||
IP_MULTICAST_LOOP |
bool |
get/set |
如果TRUE,發至多播地址的數據將原封不動地“反射”或“反彈”回套接字的進入緩沖區 |
|||||||||||||
IP_ADD_MEMBERSHIP |
struct ip_mreq |
set |
在指定的IP組內為套接字賦予成員資格 |
|||||||||||||
IP_DROP_MEMBERSHIP |
struct ip_mreq |
set |
將套接字從指定的IP組內刪去(撤消成員資格) |
|||||||||||||
IP_DONTFRAGMENT |
bool |
get/set |
如果是TRUE,就不對IP數據報進行分段 |
|||||||||||||
level級別:IPPROTO_TCP | ||||||||||||||||
optname(選項名) |
選項值數據類型 |
訪問 |
說明 |
|||||||||||||
TCP_NODELAY |
bool |
get/set |
若為TRUE, 就會在套接字上禁用Nagle算法 (只適用於流式套接字) |