在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算法 (只適用于流式套接字) |
新聞熱點
疑難解答