关于BOOST的ASIO库的Socket最大连接数问题

时间:2022-02-06 08:18:05
最近偶尔学习下BOOST库,发现关于ASIO的应用还不是很多,大多都集中在Regx的讨论上。今天这里就ASIO的一个点发表一点讨论吧。
先在网上搜索了下关于ASIO的问题,发现有人反映说最多只能建立1023个连接。 对于这一点我觉得有点意思。
因此扒拉出最新的BOOST代码,(版本号:1.53): 先说结论:就1.53版本来说,这个问题是不存在的。因此怀疑是之前某一个版本存在BUG,现在已经更正了。
相应的源代码如下:
namespace boost {namespace asio {namespace detail {
// Adapts the FD_SET type to meet the Descriptor_Set concept's requirements.class win_fd_set_adapter : noncopyable{public:  enum { default_fd_set_size = 1024 };
  win_fd_set_adapter()    : capacity_(default_fd_set_size),      max_descriptor_(invalid_socket)  {    fd_set_ = static_cast<win_fd_set*>(::operator new(          sizeof(win_fd_set) - sizeof(SOCKET)          + sizeof(SOCKET) * (capacity_)));    fd_set_->fd_count = 0;  }
  ~win_fd_set_adapter()  {    ::operator delete(fd_set_);  }
  void reset()  {    fd_set_->fd_count = 0;    max_descriptor_ = invalid_socket;  }
  bool set(socket_type descriptor)  {    for (u_int i = 0; i < fd_set_->fd_count; ++i)      if (fd_set_->fd_array[i] == descriptor)        return true;
    if (fd_set_->fd_count == capacity_)    {      u_int new_capacity = capacity_ + capacity_ / 2;      win_fd_set* new_fd_set = static_cast<win_fd_set*>(::operator new(            sizeof(win_fd_set) - sizeof(SOCKET)            + sizeof(SOCKET) * (new_capacity)));
      new_fd_set->fd_count = fd_set_->fd_count;      for (u_int i = 0; i < fd_set_->fd_count; ++i)        new_fd_set->fd_array[i] = fd_set_->fd_array[i];
      ::operator delete(fd_set_);      fd_set_ = new_fd_set;      capacity_ new_capacity;    }
    fd_set_->fd_array[fd_set_->fd_count++] = descriptor;    return true;  }
  bool is_set(socket_type descriptor) const  {    return !!__WSAFDIsSet(descriptor,        const_cast<fd_set*>(reinterpret_cast<const fd_set*>(fd_set_)));  }
  operator fd_set*()  {    return reinterpret_cast<fd_set*>(fd_set_);  }
  socket_type max_descriptor() const  {    return max_descriptor_;  }
private:
  // This structure is defined to be compatible with the Windows API fd_set  // structure, but without being dependent on the value of FD_SETSIZE. We use  // the "struct hack" to allow the number of descriptors to be varied at  // runtime.  struct win_fd_set  {    u_int fd_count;    SOCKET fd_array[1];  };
  win_fd_set* fd_set_;  u_int capacity_;  socket_type max_descriptor_;};
} // namespace detail} // namespace asio} // namespace boost


分析: 在关键点用红色强调了,默认可以建立的连接数肯定是 1024(见代码:default_fd_set_size = 1024) .
但是一旦当连接数达到这个最大数之后,紧接着会再次扩容申请更大的资源。(见代码段:if (fd_set_->fd_count == capacity_) ... )