總覽
打開一個網(wǎng)絡(luò)socket后可以使用set/getsockopt可實現(xiàn)用戶空間與內(nèi)核的通信登失,本質(zhì)和ioctl差不多迂苛,區(qū)別在于set/getsockopt不用新建設(shè)備直颅,直接利用系統(tǒng)已有的socket類型就可以進行刮便,可用setsockopt函數(shù)向內(nèi)核寫數(shù)據(jù)褪秀,用getsockopt向內(nèi)核讀數(shù)據(jù)蓄诽。
#include <sys/types.h>
#include <sys/socket.h>
int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen);
參數(shù):
sock:將要被設(shè)置或者獲取選項的套接字。socket描述符
level:選項所在的協(xié)議層媒吗。proto是sock協(xié)議仑氛,IP RAW的就用SOL_SOCKET/SOL_IP等,TCP/UDP socket的可用SOL_SOCKET/SOL_IP/SOL_TCP/SOL_UDP等闸英,即高層的socket是都可以使用低層socket的命令字的
optname:需要訪問的選項名锯岖。操作命令字,由自己定義
optval:對于getsockopt()甫何,指向返回選項值的緩沖出吹。對于setsockopt(),指向包含新選項值的緩沖辙喂。數(shù)據(jù)緩沖區(qū)起始位置指針捶牢,set操作時是將緩沖區(qū)數(shù)據(jù)寫入內(nèi)核,get的時候是將內(nèi)核中的數(shù)據(jù)讀入該緩沖區(qū)
optlen:數(shù)據(jù)長度巍耗。對于getsockopt()秋麸,作為入口參數(shù)時,選項值的最大長度芍锦。作為出口參數(shù)時竹勉,選項值的實際長度。對于setsockopt()娄琉,現(xiàn)選項的長度次乓。
返回值:
成功執(zhí)行時,返回0孽水。失敗返回-1票腰,errno被設(shè)為以下的某個值 <wbr> <wbr>
EBADF:sock不是有效的文件描述詞
EFAULT:optval指向的內(nèi)存并非有效的進程空間
EINVAL:在調(diào)用setsockopt()時,optlen無效
ENOPROTOOPT:指定的協(xié)議層不能識別選項
ENOTSOCK:sock描述的不是套接字
level指定控制套接字的層次女气⌒游浚可以取三種值:
1)SOL_SOCKET:通用套接字選項.
2)IPPROTO_IP:IP選項.
3)IPPROTO_TCP:TCP選項.
optname指定控制的方式(選項的名稱),我們下面詳細解釋
optval獲得或者是設(shè)置套接字選項.根據(jù)選項名稱的數(shù)據(jù)類型進行轉(zhuǎn)換
Linux下getsockopt/setsockopt 函數(shù)說明
// 接收緩沖區(qū)
int nRecvBuf=32*1024; //設(shè)置為32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//發(fā)送緩沖區(qū)
int nSendBuf=32*1024;//設(shè)置為32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
注意:
當設(shè)置TCP套接口接收緩沖區(qū)的大小時,函數(shù)調(diào)用順序是很重要的,因為TCP的窗口規(guī)模選項是在建立連接時用SYN與對方互換得到的缘滥。對于客戶轰胁,SO_RCVBUF選項必須在connect之前設(shè)置;對于服務(wù)器朝扼,SO_RCVBUF選項必須在listen前設(shè)置赃阀。