UNP-UNIX網絡編程 第七章:獲取/設置套接字選項的方法

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  
  1. sockfd顯然套接字描述符,其必須是已打開的套接字描述符。
  2. level指示了後面選項名稱(optname)的所屬類型。
  3. optname指示需要獲取/設置的套接字選項名稱
  4. optval,get時,返回獲取的選項值,set時,設置選項的值。
  5. optlen,爲該選項值的長度。顯然get時,是指針,使得內核可以修改它。Set時,是值傳遞,告訴內核大小。

二.套接字選項大致的分爲兩種類型:

  1. 啓動或禁止某選項。這時,該選項只有0、非0兩個值
  2. 獲取、設置某選項。這時我們可以指定、獲取這個選項的具體值(可以是int,可以是結構體)。
    通用套接字選項:即level的參數爲SOL_SOCKET
    IPv4套接字選項:即level的參數爲IPPROTO_IP
    IPv6套接字選項:即level的參數爲IPPROTO_IPV6
    TCP套接字選項:即level的參數爲IPPROTO_TCP
    SCTP套接字選項:即level的參數爲IPPROTO_SCTP

三.fcntl函數:

設置套接字非阻塞,設置套接字信號驅動,設置/獲取套接字屬主,這四個操作POSIX都推薦使用fcntl函數來完成。

#include<fcntl.h>  
int fcntl(int fd, int cmd, .../*int arg*/);//返回:成功取決於cmd,失敗返回-1  
  1. 設置套接字爲非阻塞式I/O:cmd爲F_SETFL, arg爲O_NONBLOCK; F_SETFL來設置套接字標誌
  2. 設置套接字爲信號驅動式I/O:cmd爲F_SETFL,,arg爲O_ASYNC; F_GETFL來獲得套接字標誌
    我們把一個套接字設置成一旦狀態變化,內核就產生一個SIGIO信號。
  3. 設置套接字屬主:cmd爲F_SETOWN,arg爲進程ID或進程組ID,獲取套接字屬主:cmd爲F_GETOWN
    F_SETOWN命令用於指定接收信號SIGIO和SIGURG遞交的進程ID或進程組ID。相當於設置該套接字的父進程,父進程組。
    設置套接字爲非阻塞式I/O的例程:
//正確做法,先取得當前標誌,然後與新標誌邏輯與後再設置標誌。  
int flag;  
if((flag=fcntl(fd,F_GETFL,0))<0)  
   err_sys("F_GETFL error");  
flag |= O_NONBLOCK;//開啓非阻塞   flag &=~O_NONBLOCK;  關閉非阻塞  
if(fcntl(fd, F_SETFL,flag)<0)  
   err_sys("F_SETFL error");  

(1).信號SIGIO和SIGURG僅在已使用F_SETOWN命令設置某套接字的屬主後纔會產生,
所以我們再設置了某套接字爲信號驅動後,應當立即設置它的屬主。
(2)使用socket函數新創建的套接字沒有屬主,但是,如果一個新套接字是從一個監聽套接字創建而來,
且這個監聽套接字已有屬主,則已連接套接字將繼承監聽套接字的屬主。許多套接字選項都是這樣繼承而來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章