intsetsockopt(intsock,intlevel,intoptname,constvoid*optval,socklen_toptlen卡塔尔(قطر‎;sock:将要被安装只怕获得选项的套接字。level:选项所在的合同层。optname:要求寻访的选项名。optval:对于getsockopt(卡塔尔,指向重返选项值的缓冲。对于setsockopt(卡塔尔(قطر‎,指向包括新选项值的缓冲。optlen:对于getsockopt(卡塔尔(قطر‎,作为入口参数时,选项值的最大尺寸。作为出口参数时,选项值的实在尺寸。对于setsockopt(卡塔尔(قطر‎,现选项的长短。—————————————————————–该函数除了第三个参数可以预知外,其余参数难以明白,哪位朋友能简单易懂的解释一下吗?多谢!第四个参数解释说“选项所在的构和层”,不理解。第多少个参数解释说“供给拜候的选项名”,“需求拜候的选项名“是如何看头?不晓得。。。。

【 getsockopt/setsockopt系统调用】   
    
功效描述: 
赢得大概设置与有个别套接字关联的选
项。选项恐怕存在于多层协商业中学,它们总会出现在最上边的套接字层。当操作套接字选项时,选项坐落于的层和甄选的名号必得付出。为了操作套接字层的选项,应该
将层的值内定为SOL_SOCKET。为了操作此外层的选项,调控选项的适度左券号必需提交。例如,为了表示五个采纳由TCP契约深入分析,层应该设定为研商号TCP。

用法: 
int setsockopt(
  __in          SOCKET        s,
  __in          int                level,
  __in          int                optname,
  __in          const char* optval,
  __in          int               optlen
);

int getsockopt(
  __in          SOCKET   s,
  __in          int           level,
  __in          int           optname,
  __out        char*     optval,
  __in_out    int*       optlen
);

参数:   
sock:就要被设置也许得到选项的套接字。
level:选项所在的左券层。
optname:需求拜候的选项名。

optval:对于getsockopt(卡塔尔,指向再次来到选项值的缓冲。

             对于setsockopt(卡塔尔,指向包括新选项值的缓冲。

optlen:对于getsockopt(卡塔尔国,作为入口参数时,选项值的最大尺寸。作为言语参数时,选项值的实际尺寸。

              对于setsockopt(),The size, in bytes, of
the optval buffer. 

 

level内定调控套接字的档案的次序.能够取三种值: 
     1)SOL_SOCKET:通用套接字选项. 
     2)IPPROTO_IP:IP选项. 
     3)IPPROTO_TCP:TCP选项. 

optname钦命调控的主意(选项的称谓卡塔尔(英语:State of Qatar),我们上边安详严整 

optval获得只怕是设置套接字选项.依据选项名称的数据类型实行转换 

筛选名称        表明                  数据类型 
======================================================================== 
            SOL_SOCKET 
———————————————————————— 
SO_BROADCAST     允许发送广播数据            int 
SO_DEBUG          允许调节和测量检验                int 
SO_DONTROUTE     不查找路由               int 
SO_E凯雷德ROR        获得套接字错误             int 
SO_KEEPALIVE        保持三番五次                int 
SO_LINGE奇骏         延迟关闭连接              struct
linger 
SO_OOBINLINE      带外数据放入寻常数据流         int 
SO_RCVBUF         选用缓冲区大小             int 
SO_SNDBUF        发送缓冲区大小             int 
SO_RCVLOWAT       选择缓冲区下限             int 
SO_SNDLOWAT       发送缓冲区下限             int 
SO_RCVTIMEO       选拔超时                struct
timeval 
SO_SNDTIMEO       发送逾期                struct
timeval 
SO_REUSERADDCR-V      允许重用本地地址和端口         int 
SO_TYPE             
获得套接字类型             int 

SO_BSDCOMPAT      与BSD系统相配              int 

            IPPROTO_IP 

IP_HD奇骏INCL       在数码包中富含IP首部          int 
IP_OPTINOS       IP首部选项               int 
IP_TOS           服务类型 
IP_TTL          

 生存时间                int 

            IPPRO_TCP 

TCP_MAXSEG       TCP最大数据段的尺寸           int 

TCP_NODELAY       不使用Nagle算法             int 

回到表达:   
顺理成章实行时,再次来到0。失利重回-1,errno被设为以下的某部值   
EBADF:sock不是有效的文本描述词
EFAULT:optval指向的内部存款和储蓄器并非立竿见影的长河空间
EINVAL:在调用setsockopt()时,optlen无效
ENOPROTOOPT:钦定的合同层无法识别选项
ENOTSOCK:sock描述的不是套接字

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前安装。

 

相关文章