Bootstrap

地址复用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.\n");
    #endif //SO_REUSEPORT
    }
posted on 2018-12-04 18:15 0nism 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/0nism/p/10065836.html

;