getsockopt和setsockopt函數


  在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算法 (只適用於流式套接字) 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM