void EpollReactor::run() { epoll_event ev, events[10000]; int _epf = epoll_create(10000); int sock = _server->sock(); ev.data.fd = sock; ev.events = EPOLLIN; epoll_ctl(_epf, EPOLL_CTL_ADD, sock, &ev); if (_buffer_size < 1024 || _buffer_size > 1024 * 1024 * 100) _buffer_size = 1024; char* buffer = new char[_buffer_size]; char* buf; size_t len = 0; int r = 0; int peer; sockaddr_in addr; socklen_t sock_len; TCPSocket peersocket; while(1) { buf = buffer; int n = epoll_wait(_epf, events, 10000, -1); if (n > 0) { //t = clock(); for(int i = 0; i < n; ++i) { if(events[i].data.fd == sock) { // process accept peer = accept(sock, (sockaddr*)&addr, &sock_len); if (peer == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) { perror ("accept by others"); continue; } perror("accept error"); return; } r = _server->handle()->handle_handshake(peer, buf, _buffer_size); if (r == -1){ ::close(peer); continue; } peersocket.sock(peer); peersocket.set_noblock(); ev.data.fd = peer; ev.events = EPOLLIN; epoll_ctl(_epf, EPOLL_CTL_ADD, peer, &ev); perror ("epoll_ctr has issue? :"); cout << "new socket:" << peer << endl << flush; } else { r = _server->handle()->handle_input(events[i].data.fd, buf, _buffer_size); if (r == -1) { epoll_ctl(_epf, EPOLL_CTL_DEL, events[i].data.fd, &ev); ::close(events[i].data.fd); cout << "close socket:" << peer << endl << flush; continue; } } } //cout << n << "cost: " << clock() -t << endl; } } }