77 msg_handle_ = msg_handle;
86 listened_port_ = port;
89 if (setrlimit(RLIMIT_NOFILE, &rt) == -1) {
93 listener_sock_ = socket(AF_INET, SOCK_DGRAM, 0);
94 if (listener_sock_ == -1) {
97 int opt = SO_REUSEADDR;
98 setsockopt(listener_sock_, SOL_SOCKET, SO_REUSEADDR, &opt,
sizeof(opt));
99 setnonblocking(listener_sock_);
101 struct sockaddr_in serv_addr;
102 serv_addr.sin_family = PF_INET;
103 serv_addr.sin_port = htons((uint16_t)listened_port_);
104 serv_addr.sin_addr.s_addr = INADDR_ANY;
105 if (bind(listener_sock_, (
struct sockaddr *)&serv_addr,
106 sizeof(
struct sockaddr)) == -1) {
107 close(listener_sock_);
111 struct epoll_event ev;
112 ev.events = EPOLLIN | EPOLLET;
113 ev.data.fd = listener_sock_;
114 if (epoll_ctl(kdpfd_, EPOLL_CTL_ADD, listener_sock_, &ev) < 0) {
115 close(listener_sock_);
127 nfds = epoll_wait(kdpfd_, events, 10000, -1);
133 for (
int i = 0; i < nfds; ++i) {
134 if (events[i].data.fd == listener_sock_) {
137 pthread_attr_init(&attr);
138 pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
139 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
141 par->
fd_ = events[i].data.fd;
143 if (pthread_create(&thread, &attr,
145 reinterpret_cast<void *
>(par))) {
152 close(listener_sock_);
158 if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0) | O_NONBLOCK) == -1) {