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前设置。
相关文章
相关标签/搜索