zoukankan      html  css  js  c++  java
  • 地址复用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
        }
    
  • 相关阅读:
    [转]在滴滴和头条干了 2 年后端开发,太真实…
    美团DB数据同步到数据仓库的架构与实践学习
    趣头条实时平台架构
    Spark Web UI 监控详解
    前端框架Vue入门
    Spark on Yarn详解
    Spark原理及关键技术点
    Flink应用程序结构开发介绍
    如何进行Flink项目构建,快速开发Flink应用程序?
    机器学习基础
  • 原文地址:https://www.cnblogs.com/0nism/p/10065836.html
Copyright © 2011-2022 走看看