/* void loader::load(pool_entry & entry, request_rec* r) { cout << "loader::load" << endl; auto_ptr<dso_code> code( new dso_code(r->filename, r->finfo.mtime) ); entry.servlet = create_servlet(code.get()); entry.handle = code.release(); } */ HttpServlet* loader::create_servlet(dso_code* code) { // cout << "loader::create_servlet" << endl; auto_ptr<HttpServlet> servlet( code->call<HttpServlet*>("create") ); if (!servlet.get()) throw runtime_error("Error loading servlet module. Servlet creation function returned NULL. "); servlet->init(); return servlet.release(); }
int main(int argc, char *argv[]) { //char buffer[BUFFER_SIZE]; int sockfd, newsockfd, portno, pid; socklen_t clilen; struct sockaddr_in serv_addr, cli_addr; /* if (argc < 2) { */ /* fprintf(stderr,"ERROR, no port provided\n"); */ /* exit(1); */ /* } */ sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0){ perror("ERROR opening socket"); exit(1); } bzero((char *) &serv_addr, sizeof(serv_addr)); // portno = atoi(argv[1]); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(PORTNO); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0){ perror("ERROR on binding"); exit(1); } listen(sockfd,5); clilen = sizeof(cli_addr); while (1) { newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0){ perror("ERROR on accept"); exit(1); } pid = fork(); if (pid < 0){ perror("ERROR on fork"); exit(1); } if (pid == 0) { close(sockfd); servlet(newsockfd); exit(0); } //make sure to wait at some point to avoid zombies else close(newsockfd); waitpid(-1, NULL, WNOHANG); } close(sockfd); return 0; }
void master_service::on_accept(acl::socket_stream& conn) { logger("connect from %s, fd %d", conn.get_peer(), conn.sock_handle()); conn.set_rw_timeout(30); acl::memcache_session session("127.0.0.1:11211"); http_servlet servlet(&conn, &session); // charset: big5, gb2312, gb18030, gbk, utf-8 servlet.setLocalCharset("utf-8"); while(servlet.doRun()) {} logger("disconnect from %s", conn.get_peer()); }
static void http_server(ACL_VSTREAM *cstream) { ACL_EVENT *event = (ACL_EVENT *) cstream->context; acl::socket_stream conn; conn.open(cstream); acl::memcache_session session("127.0.0.1:11211"); http_servlet servlet(&conn, &session); servlet.setLocalCharset("gb2312"); if (servlet.doRun() == false) return; conn.unbind(); acl_event_enable_read(event, cstream, 120, client_callback, NULL); }
// @override void on_accept(acl::socket_stream& conn) { acl_msg_info(">>>accept connection: %d", conn.sock_handle()); conn.set_rw_timeout(0); acl::memcache_session session("127.0.0.1:11211"); http_servlet servlet(&conn, &session); servlet.setLocalCharset("gb2312"); while (true) { if (servlet.doRun() == false) break; } acl_msg_info(">>>close one connection: %d, %s", conn.sock_handle(), acl::last_serror()); }
static void http_server(FIBER *, void *ctx) { acl::socket_stream *conn = (acl::socket_stream *) ctx; printf("start one http_server\r\n"); acl::memcache_session session("127.0.0.1:11211"); http_servlet servlet(conn, &session); servlet.setLocalCharset("gb2312"); while (true) { if (servlet.doRun() == false) break; } printf("close one connection: %d, %s\r\n", conn->sock_handle(), acl::last_serror()); delete conn; }
/*---------------------------------------------------------------------*/ main(int count, char *strings[]) { int sd, pid; struct sockaddr_in addr; struct sigaction act; if ( count != 2 ) { printf("usage: %s <port>\n", strings[0]); exit(0); } bzero(&act, sizeof(act)); act.sa_handler = sig_child; act.sa_flags = SA_NOCLDSTOP | SA_RESTART; if ( sigaction(SIGCHLD, &act, 0) != 0 ) perror("sigaction()"); sd = socket(PF_INET, SOCK_STREAM, 0); bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(atoi(strings[1])); addr.sin_addr.s_addr = INADDR_ANY; if ( bind(sd, (struct sockaddr*)&addr, sizeof(addr)) == 0 ) { listen(sd, 15); for (;;) { if ( ChildCount < MAXPROCESSES ) { if ( (pid = fork()) == 0 ) /*---CHILD---*/ servlet(sd); else if ( pid > 0 ) /*---PARENT---*/ ChildCount++; else /*---ERROR---*/ perror("fork() failed"); } else sleep(1); /*--- OR, sched_yield()---*/ } } else perror("bind()"); }