UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)(SO_REUSEADDR)

有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项。

  1. int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)  
  2. 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描述的不是套接字


数据结构说明:

1)结构:linger,它的声明如下:

  1. struct linger{  
  2.      int l_onoff;    //状态  
  3.      int l_linger;    //等待时间  
  4. };  
2)结构:timeval,它的声明如下:

  1. struct timeval{  
  2.      time_t    tv_sec;   //秒  
  3.      suseconds_t  tv_usec; //微秒:百万分之一秒  
  4. };  


举例说明:

     SO_RCVBUF和SO_SNDBUF每个套接口都有一个发送缓冲区和一个接收缓冲区,使用这两个套接口选项可以改变缺省缓冲区大小。

  1. // 接收缓冲区  
  2. int nRecvBuf=32*1024;         //设置为32K  
  3. setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));  
  4. //发送缓冲区  
  5. int nSendBuf=32*1024;//设置为32K  
  6. setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));  

注意:

     当设置TCP套接口接收缓冲区的大小时,函数调用顺序是很重要的,因为TCP的窗口规模选项是在建立连接时用SYN与对方互换得到的。对于客户,SO_RCVBUF选项必须在connect之前设置;对于服务器,SO_RCVBUF选项必须在listen前设置。


UNIX网络编程——套接字选项(SO_REUSEADDR)

1、一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。

  SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态

2、SO_REUSEADDR和SO_REUSEPORT


SO_REUSEADDR提供如下四个功能:

  • 当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。这通常是重启监听服务器时出现若不设置此选项则bind时将出错。
  • SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例(多个服务器进程只要每个实例捆绑一个不同的本地IP地址即可。对于TCP我们绝不可能启动捆绑相同IP地址和相同端口号的多个服务器,这是完全重复的捆绑(completely duplicate binding)
  • SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。
  • SO_REUSEADDR允许完全相同的地址和端口的重复绑定(completely duplicate binding)。但这只用于UDP的多播,不用于TCPTCP不支持多播)。

SO_REUSEPORT选项有如下语义:

    此选项允许完全重复捆绑但仅在想捆绑相同IP地址和端口的套接口都指定了此套接口选项才

    如果被捆绑的IP地址是一个多播地址则SO_REUSEADDRSO_REUSEPORT等效。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值