Method for exceeding the select limit (in Windows)

Source: Internet
Author: User

Familiar methods:

1. Modify the definition macro

# UNDEF fd_setsize

# Define fd_setsize 1024

2. Code extracted from boost ASIO

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_;};

Use this class to replace the fd_set set. fd_set uses the set method to replace this class, while fd_isset uses is_set. Several data types in the fd_isset are replaced by typedef, and the missing header file is added by yourself, noncopyable is the prohibited copy class defined in boost (copy constructor, assign values to private type, constructor and destructor are defined as protected type)

class noncopyable  {   protected:      noncopyable() {}      ~noncopyable() {}   private:  // emphasize the following members are private      noncopyable( const noncopyable& );      const noncopyable& operator=( const noncopyable& );  };

In addition, fd_setsize in Windows indicatesMaximum number of poll requestsIn Linux, fd_setsize indicatesMaximum file descriptorIf the round-robin descriptor is greater than or equal to this value, a problem may occur. See man:

Executing fd_clr () or fd_set () with a value of FD that is negative or is equal to or larger than fd_setsize will result in undefined behavior.

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.