1進階通訊端函數 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指定控制通訊端的層次.可以取三種值:
1)SOL_SOCKET:通用通訊端選項.
2)IPPROTO_IP:IP選項.
3)IPPROTO_TCP:TCP選項.
對應的optname詳細說明
optname指定控制的方式(選項的名稱).
選項名稱 說明 資料類型
======================================================================
SOL_SOCKET
SO_BROADCAST 允許發送廣播資料 int
SO_DEBUG 允許調試 int
SO_DONTROUTE 不尋找路由 int
SO_ERROR 獲得通訊端錯誤 int
SO_KEEPALIVE 保持串連 int
SO_LINGER 延遲關
SO_OOBINLINE 帶外資料放入正常資料流 int
SO_RCVBUF 接收緩衝區大小 int
SO_SNDBUF 發送緩衝區大小 int
SO_RCVLOWAT 接收緩衝區下限 int
SO_SNDLOWAT 發送緩衝區下限 int
SO_RCVTIMEO 接收逾時 struct timeval
SO_SNDTIMEO 發送逾時 struct timeval
SO_REUSERADDR 允許重用本地地址和連接埠 int
SO_TYPE 獲得通訊端類型 int
SO_BSDCOMPAT 與BSD系統相容 int
IPPROTO_IP
IP_HDRINCL 在資料包中包含IP首部 int
IP_OPTINOS IP首部選項 int
IP_TOS 服務類型
IP_TTL 存留時間 int
IPPRO_TCP
TCP_MAXSEG TCP最大資料區段的大小 int
TCP_NODELAY 不使用Nagle演算法 int
optval獲得或者是設定通訊端選項.根據選項名稱的資料類型進行轉換 ,有時是通訊端選項.ON或者OFF等
2 進階通訊端函數 ioctl
int ioctl(int fd,int req,...)
ioctl可以控制所有的檔案描述符的情況,這裡介紹一下控制通訊端的選項.
ioctl的控制選項
SIOCATMARK 是否到達帶外標記 int
FIOASYNC 非同步輸入/輸出標誌 int
FIONREAD 緩衝區可讀的位元組數 int
詳細的選項請用 man ioctl_list 查看.
3 進階通訊端函數 fcntl
status = fcntl (hand, option, mode ) ;
上述fcntl函數調用中,各參數定義如下:
handle:已開啟的檔案控制代碼。
option:一般可以是下列兩種值:
F_GETFL:表示讀取檔案狀態值。
F_SETFL:表示設定檔案狀態值。
(注意:F_GETFL和F_SETFL都被定義在fcntl.h)
mode:如果optipn是F_GETFL,則這個參數值可以是任意值。如果是F_SETFL,則參數值可以是下列值:
O_WRONLY:將檔案設定成唯寫狀態。
O_RDWR: 將檔案設定成讀寫狀態。
O_RDONLY:將檔案設定成唯讀狀態。
status:函數會將調用結果賦給status,如運行失敗,則status的值會被設成-1。
使用執行個體:
執行個體1:setsockopt
//使得地址可被重用
int optavl3=1;
int optlen3 = sizeof(int);
getsockopt(s, SOL_SOCKET, SO_REUSEADDR, &optavl3, &optlen3);
執行個體2:fcntl
//設定socket非阻塞
void setnonblocking(int sock)
...{
int opts;
opts = fcntl(sock, F_GETFL);
if (opts < 0)
...{
perror("fcntl(sock, GETFL)");
exit(1);
}
opts = opts|O_NONBLOCK;
if (fcntl(sock, F_SETFL, opts) < 0)
...{
perror("fcntl(sock, SETFL, opts)");
exit(1);
}
}