int main(int argc, char const *argv[]) { printf("Befin insrv !!!\n"); printf("serverIsBigEndian == %d !!!\n", isBigEndian()); CShmQueueSingle inq, outq; outq.crt(1024 * 1024 * 16, 1111); outq.get(); outq.init(); outq.clear(); inq.crt(1024 * 1024 * 16, 2222); inq.get(); inq.init(); inq.clear(); CSocketEpoll epoll(8000, 0, 1000, 0, 1, 1);//(int epoll_Size, int epoll_Timeout, int Listenq, int clientIsBigEndian, int serverIsBigEndian) epoll.prepare("0.0.0.0", 10203, &outq, &inq);//(const char * serv_addr, int port_num, CShmQueueSingle *poutq, CShmQueueSingle *pinq); epoll.run(); // test_socket_srv("192.168.190.131", 10203); return 0; }
void TestHTTP::requestResponseOverSocket() { TESTSTEP("SigPipe handler, EPoll, listening, connecting with client"); csjp::Signal pipeSignal(SIGPIPE, csjp::Signal::sigpipeHandler); csjp::EPoll epoll(5); HTTPListener listener("127.0.0.1", 30303); epoll.add(listener); HTTPClient client("127.0.0.1", 30303); epoll.add(client); epoll.waitAndControl(10); // 0.01 sec VERIFY(businessServers.size() == 1); for(auto & server : businessServers) epoll.add(server); TESTSTEP("Client sends request"); client.sendTestRequest(); for(auto event : epoll.waitAndControl(10)){ // 0.01 sec DBG("ControlEvent received: %", event.name()); switch(event.code){ case csjp::EPoll::ControlEventCode::ClosedByPeer: break; case csjp::EPoll::ControlEventCode::ClosedByHost: break; case csjp::EPoll::ControlEventCode::Exception: EXCEPTION(event.exception); throw; break; } } TESTSTEP("Server responses"); for(int i=0; i<10 && businessServers.size(); i++) { for(auto event : epoll.waitAndControl(10)){ // 0.01 sec DBG("ControlEvent received: %", event.name()); switch(event.code){ case csjp::EPoll::ControlEventCode::ClosedByPeer: break; case csjp::EPoll::ControlEventCode::ClosedByHost: break; case csjp::EPoll::ControlEventCode::Exception: EXCEPTION(event.exception); throw; break; } } } VERIFY(businessServers.size() == 1); TESTSTEP("Destructors do the rest of cleanup"); }
int main() { Socket(); Bind(); Listen(); while (1) { select()/poll()/epoll(); if () { Accept(); } else { while (1) { Recv() / Send(); } } }
EventEngine::Ptr EventEngineFactory::createTP(const Config& p_config) { Epoll::Ptr epoll(new Epoll()); EpollED::Ptr epollED(new EpollED(epoll)); EventEngines::ThreadPool::Ptr tp(new EventEngines::ThreadPool(epollED, p_config.eventEngineSize)); KeyboardSocket::Ptr keybSocket(new KeyboardSocket()); KeyboardES::Ptr keybES(new KeyboardES(keybSocket)); EventHandler::Ptr keybEH(new KeyboardTPEH("log.txt", keybES, *tp)); TcpSocket::Ptr listenerSokcet(new TcpSocket()); ListenerES::Ptr listenerES(new ListenerES(listenerSokcet, p_config.port)); EventHandler::Ptr acceptorEH(new AcceptorEH<EventEngines::ThreadPool>(listenerES, *tp)); tp->add(keybEH); tp->add(acceptorEH); return EventEngine::Ptr(new ThreadPoolEE(tp)); }
EventEngine::Ptr EventEngineFactory::createReactor(const Config& p_config) { Epoll::Ptr epoll(new Epoll()); EpollED::Ptr epollED(new EpollED(epoll)); EventEngines::Reactor::Ptr r(new EventEngines::Reactor(epollED)); KeyboardSocket::Ptr keybSocket(new KeyboardSocket()); KeyboardES::Ptr keybES(new KeyboardES(keybSocket)); EventHandler::Ptr keybEH(new KeyboardReactorEH("log.txt", keybES)); TcpSocket::Ptr listenerSokcet(new TcpSocket()); ListenerES::Ptr listenerES(new ListenerES(listenerSokcet, p_config.port)); EventHandler::Ptr acceptorEH(new AcceptorEH<EventEngines::Reactor>(listenerES, *r)); r->add(keybEH); r->add(acceptorEH); return EventEngine::Ptr(new ReactorEE(r)); }
int TCPServer::run() { int nInterval = 0; while (m_bThreadRunFlag) { //1.epoll接收新连接,处理注册事件业务请求 if (epoll() != VIOLET_SUCCESS) nInterval += 5000; else nInterval += 10; //2.清理超时连接,利用其epoll的超时时间作为参考,间隔约为30s if (nInterval > 30000) { clearTimeOutConnection(); nInterval= 0; } PUB_Sleep(2); } return VIOLET_SUCCESS; }
EventEngine::Ptr EventEngineFactory::createHSHA(const Config& p_config) { Epoll::Ptr epoll(new Epoll()); EpollED::Ptr epollED(new EpollED(epoll)); HSHA::Ptr hsha(new HSHA(epollED, p_config.eventEngineSize)); KeyboardSocket::Ptr keybSocket(new KeyboardSocket()); KeyboardES::Ptr keybES(new KeyboardES(keybSocket)); SEH::Ptr keybSEH(new KeyboardSEH("log.txt", keybES)); AEH::Ptr keybAEH; HSHA::Handlers keybHandlers(keybSEH, keybAEH); TcpSocket::Ptr listenerSokcet(new TcpSocket()); ListenerES::Ptr listenerES(new ListenerES(listenerSokcet, p_config.port)); SEH::Ptr acceptorSEH(new AcceptorSEH(listenerES, *hsha)); AEH::Ptr acceptorAEH; HSHA::Handlers acceptorHandlers(acceptorSEH, acceptorAEH); hsha->add(keybHandlers); hsha->add(acceptorHandlers); return EventEngine::Ptr(new HalfSyncHalfAsyncEE(hsha)); }
int main(int argc, char** args) { try { uint16_t port = 8080; if (argc > 1) { port = (uint16_t) std::stoi(args[1]); } epoll_wrap epoll(200); resolver<proxy_server::resolver_extra> ip_resolver; proxy_server proxy(epoll, ip_resolver, port, 200); std::string tag = "server on port " + std::to_string(port); signal_fd sig_fd({SIGINT, SIGPIPE}, {signal_fd::SIMPLE}); epoll_registration signal_registration(epoll, std::move(sig_fd), fd_state::IN); signal_registration.update([&signal_registration, &epoll, tag](fd_state state) mutable { if (state.is(fd_state::IN)) { struct signalfd_siginfo sinf; long size = signal_registration.get_fd().read(&sinf, sizeof(struct signalfd_siginfo)); if (size != sizeof(struct signalfd_siginfo)) { return; } if (sinf.ssi_signo == SIGINT) { log("\n" + tag, "stopped"); epoll.stop_wait(); } } }); log(tag, "started"); epoll.start_wait(); } catch (annotated_exception const &e) { log(e); } }
int main (int argc, char **argv) { srand (time (NULL)); int port = 8080; int work = 4; sighandleall (&signal_handler, SA_RESTART); argv0 = *argv; setname ("cws[master]"); int selfpiperead; { int pipefd[2]; if (pipe (pipefd) == -1) { die("pipe"); } selfpipe = pipefd[1]; selfpiperead = pipefd[0]; } worker_init (port, "file"); spawn_workers (work); tcgetattr (STDIN_FILENO, &old_term); atexit (&cleanup); setterm(); int epollfd = epoll(); epoll_add (epollfd, STDIN_FILENO); epoll_add (epollfd, selfpiperead); struct epoll_event events[MAX_QUEUE]; int i, n; char cmd; while (1) { n = epoll_wait (epollfd, events, MAX_QUEUE, -1); for (i = 0; i < n; i++) { if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP) || (!(events[i].events & EPOLLIN))) { exit(1); } else if (STDIN_FILENO == events[i].data.fd) { // user input event cmd = getchar(); switch (cmd) { case 'k': printf ("Killing workers\n"); finish(1); break; case 'q': printf ("Telling workers to exit\n"); finish(0); break; case '+': spawn_workers (worker_count + 1); break; case '-': spawn_workers (worker_count - 1); break; } } else { // pipe event if (read (selfpiperead, &cmd, 1) <= 0) { die ("read"); } switch (cmd) { case CMD_KILL: printf ("Killing workers\n"); finish(0); break; case CMD_TERM: printf ("Telling workers to exit\n"); finish(1); break; case CMD_INCR: spawn_workers (worker_count + 1); break; case CMD_DECR: spawn_workers (worker_count - 1); break; case CMD_CHLD: check_workers(); break; } } } } return 0; }