這兩個函式僅用於套接字:
#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(級別)指定系統中解釋選項的**或為通用套接字**,或為某個特定於協議的**
optval是乙個指向某個變數(optval)的指標,setsockopt從*optval中取得選項待設定的新值,getsockopt則把已獲取的選項當前值存放到*optval,*optval的大小由最後乙個引數optlen指定,它對於setsockopt是乙個值引數,對於getsockopt是乙個值-結果引數*
呼叫getsockopt函式時,*optval是乙個整數,*optval中返回的值為0,表示相應選項被禁止,不為0表示相應項被啟用,類似地,setsockopt函式需要乙個不為0的*optval值裡啟用選項,乙個為0的*optval值來禁止選項。
函式fcntl提供了下列關於網路程式設計特性:
(1)非阻塞i/o。通過使用f_setfl命令設定o_nonblock檔案狀態標誌,我們可以把乙個套接字設定為非阻塞型
(2)訊號驅動i/o。通過使用f_setfl命令設定o_async檔案狀態標誌,我們可以把乙個套接字設定成一旦其狀態發生變化,核心就產生乙個sigio訊號
#include
int fcntl(int fd, int cmd, ... /* int arg */ );
//返回:若成功取決於cmd,出錯-1
每種描述符(包括套接字描述符)都有一組由f_getfl命令獲取或f_setfl命令設定的檔案標誌。其中影響套接字描述符的兩個標誌是:
o_nonblock——–非阻塞i/o
o_async————-訊號驅動式i/o
使用fcntl開啟(關閉)非阻塞i/o的典型**
int flags;
/* set a socket as nonblocking */
if ( (flags = fcntl (fd, f_getfl, 0)) < 0)
err_sys("f_getfl error");
flags |= o_nonblock;//開啟
flags |= ~o_nonblock;//關閉
if (fcntl(fd, f_setfl, flags) < 0)
err_sys("f_setfl error");
UNPv1第十七章 路由套介面
在路由器介面中支援三種型別的操作 1 程序能通過寫路由套介面向核心發訊息。2 程序能在路由套介面上從核心讀訊息,這是核心通知程序已收到乙個icmp重定向訊息並進行了處理的方式。3 程序可以用sysctl函式得到路由表或列出所有已配置的介面。在路由套介面上返回的一些訊息中包含資料鏈路套介面位址結構,他...
第七章 介面
為什麼使用介面?什麼情況下使用介面?來看看下面這個例子 目前有許多檔案的壓縮格式,包括 zip rar cab tar等等。假如每種壓縮格式都建立乙個類,那麼每個壓縮實現都會有不同的方法簽名,無法提供標準的呼叫規範。雖然方法可以在基類宣告,並在子類實現,但是這樣會用掉唯一的基類機會 c 只支援單繼承...
UNPv1第二十五章 原始套介面
原始套介面提供以下三種tcp及udp套介面一般不提供的功能。1.使用原始套介面可以讀寫icmpv4,igmpv4,icmpv6分組。例如 ping程式,就使用原始套介面傳送icmp回射請求,並接受icmp回射應答。2.使用原始套介面可以讀寫特殊的ipv4資料報,核心不處理這些資料報的ipv4協議字段...