獲取和設定套接字選項

2021-09-02 21:22:21 字數 1328 閱讀 3581

下面幾種方法可用來獲取和設定影響套接字的選項:

(1)getsockopt 和 setsockopt 函式;

(2)fcntl 函式;

(3)ioctl 函式。

本文將介紹 getsockopt 和 setsockopt 函式,對 fcntl 的介紹見[url= 函式介紹[/url],而對 ioctl 的介紹則留到後面。

#include

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);

int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

/* 兩個函式的返回值:若成功,返回 0;否則,返回 -1 */

其中引數 sockfd 指向乙個開啟的套接字描述符,level 指定系統中解釋選項的**或為通用套接字**,或為某個特定於協議的**(如 ipv4、ipv6、tcp 或 sctp)。optval 是乙個指向某個變數的指標,setsockopt 從 *optval 處取得選項 optname 待設定的新值,getsockopt 則把已獲取的選項 optname 的當前值存放到 *optval 中。*optval 的大小由 optlen 引數指定。

套接字選項粗分為兩大基本型別:一是啟用或禁止某個特性的二元選項(稱為標誌選項),二是取得並返回可以設定或檢查的特定值的選項(稱為值選項)。下面的兩張表彙總了可由 getsockopt 和 setsockopt 獲取和設定的選項。其中的「資料型別」列給出了指標 optval 必須指向的每個選項的資料型別(這一列中後跟一對花括號的記法表示乙個結構,如 linger{} 就表示 struct linger),標有「標誌」的列指出乙個選項是否為標誌選項,當 *optval 的值是 0 時表示選項被禁止,反之則表示開啟。如果「標誌」列不含有「·」,那麼相應選項用於在使用者程序與系統之間傳遞所指定資料型別的值。

[img]

[img]

其中的這幾個套接字選項是由 tcp 已連線套接字從監聽套接字繼承的:so_debug、so_dontroute、so_keepalive、so_linger、so_oobinline、so_rcvbuf、so_rcvlowat、so_sndbuf、so_sndlowat、tcp_maxseg 和 tcp_nodelay。這對 tcp 是很重要的,因為 accept 一直要到 tcp 層完成三路握手後才會給伺服器返回已連線套接字。如果想在三路握手完成時確保這些套接字選項中的某乙個是給已連線套接字設定的,那麼必須先給監聽套接字設定該選項。

通用套接字選項和TCP套接字選項

1.套接字選項函式原型 include int getsockopt int sockfd,int level,int optname,void optval,socklen t optlen int setsockopt int sockfd,int level,int optname,const...

通用套接字選項和TCP套接字選項

1.套接字選項函式原型 include int getsockopt int sockfd,int level,int optname,void optval,socklen t optlen int setsockopt int sockfd,int level,int optname,const...

套接字選項

有很多方法獲取和設定影響套接字的選項 getsockopt和setsockopt函式 fcntl函式 ioctl函式 getsockopt和setsockopt函式 int getsockopt int sockfd,int level,int optname,void optval,socklen...