zoukankan      html  css  js  c++  java
  • 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指定控制的方式(选项的名称),我们下面详细解释 

    optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换 


    选项名称        说明                  数据类型 
    ======================================================================== 
                SOL_SOCKET 
    ------------------------------------------------------------------------ 
    SO_BROADCAST     允许发送广播数据            int 
    SO_DEBUG          允许调试                int 
    SO_DONTROUTE     不查找路由               int 
    SO_ERROR        获得套接字错误             int 
    SO_KEEPALIVE        保持连接                int 
    SO_LINGER         延迟关闭连接              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_REUSERADDR      允许重用本地地址和端口         int 
    SO_TYPE              获得套接字类型             int 
    SO_BSDCOMPAT      与BSD系统兼容              int 
    ========================================================================
                IPPROTO_IP 
    ------------------------------------------------------------------------
    IP_HDRINCL       在数据包中包含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前设置。

  • 相关阅读:
    理解“统一编址与独立编址、I/O端口与I/O内存” arm
    JS + CSS 美化 select 下拉框表单
    关于 ecshop common.js 文件 自动随机输出 Powered by ECShop
    Zend Framework 入门随笔 配置与注意事项
    Delphi编程保存数据到Excel文件(4):使用NativeExcel2控件
    ORACLE 最大连接数的问题1
    一生delphi编程经验(转)
    XLSReadWriteII控件来完成10×10的乘法表
    Delphi 动态调整打印机纸张大小
    Linux下Oracle重启和修改连接数3
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/5716343.html
Copyright © 2011-2022 走看看