有很多方法獲取和設定影響套接字的選項:
-getsockopt和setsockopt函式
-fcntl函式
-ioctl函式
getsockopt和setsockopt函式
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);
level指定系統中解釋選項的**或為通用套接字**,或為某個特定與協議的**(ipv4,ipv6,tcp)
optval是乙個指向某個變數(*optval)的指標,setsockopt從*optval中取得選項帶設定的新值,getsockopt則把以獲取的選項當前值存放到*optval中,*optval的大小由最後乙個引數指定,對於setsockopt是乙個值引數,對於getsockopt是乙個值-結果引數。
套接字選項彙總:
套接字的選項粗分為兩類:一是啟動或禁止某個特性的二元選項(稱為標誌選項);二是取得並返回我們可以設定或檢查特定值的選項(稱為值選項)。
(每個選項的作用不再詳述)
fcntl函式(file control檔案控制)
fcntl函式可執行各種描述符控制操作。
下圖彙總了由fcntl,ioctl和路由器套接字執行的不同操作:
前6個操作可由任何程序應用於套接字,接著兩個操作比較少見。後兩個操作由ifconfig和route之類管理程式執行。
#includeint fcntl(int fd, int cmd, ...); //若成功則取決於cmd
每種描述符都有一組f_getfl命令獲取或f_setfl命令設定的檔案標誌,其中影響套接字描述符的兩個標誌是:
o_nonblock——非阻塞式i/o
o_async——訊號驅動式i/o
設定某個檔案狀態標誌的唯一正確的方法是:先取得當前標誌,與新標誌邏輯或後再設定標誌。
使用fcntl開啟非阻塞式i/o的典型**:
int flags;
if ( (flags = fcntl(fd, f_getfl,0)) < 0)
err_sys("f_getfl error!");
flags |= o_nonblock; //儲存原本的標誌,並開啟非阻塞
if (fcntl(fd, f_setfl, flags) < 0 )
err_sys("f_setfl error!");
關閉:
flags &= ~o_nonblock;
if (fcntl(fd, f_setfl, flags) < 0)
.................
套接字選項
之前讀過unix網路程式設計,現在在看nginx原始碼,很多套接字選項不記得了,因此每遇到乙個套接字選項就在此文章中進行補充。1.獲取和設定套接字選項的方法 getsockopt,setsockopt函式 fcntl函式 ioctl函式 2.4種函式簡介 i.getsockopt,setsockop...
通用套接字選項和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...