UNIX網絡編程——套接字選項(SO_RCVBUF和SO_SNDBUF)

     有時候咱們須要控制套接字的行爲(如修改緩衝區的大小),這個時候咱們就要學習套接字選項。服務器

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指定控制套接字的層次.能夠取三種值:數據結構

  • SOL_SOCKET:通用套接字選項. 
  • IPPROTO_IP:IP選項. 
  • IPPROTO_TCP:TCP選項. 

                

                 


optname指定控制的方式(選項的名稱)

optval得到或者是設置套接字選項.根據選項名稱的數據類型進行轉換
  


返回值說明:函數

成功執行時,返回0。失敗返回-1,errno被設爲如下的某個值  
EBADF:sock不是有效的文件描述詞
EFAULT:optval指向的內存並不是有效的進程空間
EINVAL:在調用setsockopt()時,optlen無效
ENOPROTOOPT:指定的協議層不能識別選項
ENOTSOCK:sock描述的不是套接字
學習


數據結構說明:spa

1)結構:linger,它的聲明以下:
code

struct linger{
     int l_onoff;    //狀態
     int l_linger;    //等待時間
};
2)結構:timeval,它的聲明以下:

struct timeval{
     time_t    tv_sec;   //秒
     suseconds_t  tv_usec; //微秒:百萬分之一秒
};


舉例說明:

     SO_RCVBUF和SO_SNDBUF每一個套接口都有一個發送緩衝區和一個接收緩衝區,使用這兩個套接口選項能夠改變缺省緩衝區大小。
接口

// 接收緩衝區
int nRecvBuf=32*1024;         //設置爲32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//發送緩衝區
int nSendBuf=32*1024;//設置爲32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

注意:      當設置TCP套接口接收緩衝區的大小時,函數調用順序是很重要的,由於TCP的窗口規模選項是在創建鏈接時用SYN與對方互換獲得的。對於客戶,SO_RCVBUF選項必須在connect以前設置;對於服務器,SO_RCVBUF選項必須在listen前設置。
相關文章
相關標籤/搜索