歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> Unix基礎知識

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獲得或者是設置套接字選項.根據選項名稱的數據類型進行轉換

查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/

返回值說明:

成功執行時,返回0。失敗返回-1,errno被設為以下的某個值

EBADF:sock不是有效的文件描述詞
EFAULT:optval指向的內存並非有效的進程空間
EINVAL:在調用setsockopt()時,optlen無效
ENOPROTOOPT:指定的協議層不能識別選項
ENOTSOCK:sock描述的不是套接字

數據結構說明:

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

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前設置。

Copyright © Linux教程網 All Rights Reserved