• 地址复用setsockopt()


    地址复用setsockopt()

    Cp from戴墨镜.

    1.setsockopt()作用

    socket关闭之后,操作系统不会立即收回对端口的控制权,而是要经历一个等待阶段。此时对这个端口绑定就会出错。想要立即进行绑定,就必须先设置SO_REUSEADDR.
    或者在关闭socket的时候,使用setsockopt设置SO_REUSEADDR。才会消除等待时间。

           #include <sys/types.h>          /* See NOTES */
           #include <sys/socket.h>
    
           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);
                            
    

    sockfd: 套接字描述字
    level: 选项定义的层次;支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6.
    optname: 需要设置的选项
    optval: 指针,指向存放选项值的缓冲区
    optlen: optval缓冲区长度

    • level 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

    二、简单用法

        //地址复用
        void set_reuseaddr(int sockfd, int optval)
        {
            int on = (optval != 0) ? 1 : 0;
            //int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
            /* sockfd:标识一个套接口的描述字。
              level:选项定义的层次;支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。
              optname:需设置的选项。
              optval:指针,指向存放选项值的缓冲区。
              optlen:optval缓冲区长度。
                返回值:  成功返回0,失败返回 -1.  */
    
           if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
                ERR_EXIT("setsockopt SO_REUSEADDR");
        }
    
        //端口复用
        void set_reuseport(int sockfd, int optval)
        {
        #ifdef SO_REUSEPORT
            int on = (optval != 0) ? 1 : 0;
            if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) < 0)
                ERR_EXIT("setsockopt SO_REUSEPORT");
        #else
            fprintf(stderr, "SO_REUSEPORT is not supported.
    ");
        #endif //SO_REUSEPORT
        }
    
  • 相关阅读:
    设计模式系列
    Python3 系列之 可变参数和关键字参数
    设计模式系列
    【HANA系列】SAP HANA ODBC error due to mismatch of version
    【FICO系列】SAP FICO FS00修改科目为未清项目管理
    【FIORI系列】SAP OpenUI5 (SAPUI5) js框架简单介绍
    【HANA系列】SAP HANA SQL获取当前日期加若干天后的日期
    【HANA系列】SAP HANA SQL获取本周的周一
    【HANA系列】SAP HANA SQL获取当前日期
    【HANA系列】SAP HANA SQL获取当前日期最后一天
  • 原文地址:https://www.cnblogs.com/0nism/p/10065836.html
Copyright © 2020-2023  润新知