1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| #include "cselect.h" #include <cerrno> #include <cstring>
CSelect::CSelect() { mMaxFd = 0; FD_ZERO(&mErrorFds); FD_ZERO(&mWriteFds); FD_ZERO(&mReadFds); FD_ZERO(&mReadSelectFds); FD_ZERO(&mWriteSelectFds); FD_ZERO(&mErrorSelectFds); }
CSelect:: ~CSelect() {
}
void CSelect::zeroFds(int fd_type) { if (fd_type & C_FDS_READ) { FD_ZERO(&mReadFds); }
if (fd_type & C_FDS_WRITE) { FD_ZERO(&mWriteFds); }
if (fd_type & C_FDS_ERROR) { FD_ZERO(&mErrorFds); } }
void CSelect::addFd(int fd_type, int fd) { if (fd_type & C_FDS_READ) { FD_SET(fd, &mReadFds); }
if (fd_type & C_FDS_WRITE) { FD_SET(fd, &mWriteFds); }
if (fd_type & C_FDS_ERROR) { FD_SET(fd, &mErrorFds); }
if (fd > mMaxFd) { mMaxFd = fd; } }
void CSelect::removeFd(int fd_type, int fd) { if (fd_type & C_FDS_READ) { FD_CLR(fd, &mReadFds); }
if (fd_type & C_FDS_WRITE) { FD_CLR(fd, &mWriteFds); }
if (fd_type & C_FDS_ERROR) { FD_CLR(fd, &mErrorFds); } }
bool CSelect::isSetFd(int fd_type, int fd) { bool is_set = false; if (fd_type & C_FDS_READ) { is_set = FD_ISSET(fd, &mReadSelectFds); }
if (fd_type & C_FDS_WRITE) { is_set = FD_ISSET(fd, &mWriteSelectFds); }
if (fd_type & C_FDS_ERROR) { is_set = FD_ISSET(fd, &mErrorSelectFds); } return is_set; }
int CSelect::select(int fd_type) { fd_set *read_fds = nullptr; fd_set *write_fds = nullptr; fd_set *error_fds = nullptr;
if (fd_type & C_FDS_READ) { memcpy(&mReadSelectFds, &mReadFds, sizeof(fd_set)); read_fds = &mReadSelectFds; }
if (fd_type & C_FDS_WRITE) { memcpy(&mWriteSelectFds, &mWriteFds, sizeof(fd_set)); write_fds = &mWriteSelectFds; }
if (fd_type & C_FDS_ERROR) { memcpy(&mErrorSelectFds, &mErrorFds, sizeof(fd_set)); error_fds = &mErrorSelectFds; }
return ::select(mMaxFd + 1, read_fds, write_fds, error_fds, nullptr); }
|