⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wshare.cxx

📁 PTypes是一个扩充了多线程和网络功能的STL库
💻 CXX
字号:
/* * *  C++ Portable Types Library (PTypes) *  Version 2.0.2  Released 17-May-2004 * *  Copyright (C) 2001-2004 Hovik Melikyan * *  http://www.melikyan.com/ptypes/ * */#include <stdlib.h>#include <limits.h>#ifndef WIN32#  include <pwd.h>#  include <unistd.h>#  include <grp.h>#endif#include "config.h"#include "sysutils.h"#include "log.h"#include "utils.h"#include "urlutils.h"#include "request.h"#include "clients.h"#include "modules.h"USING_PTYPESclass client_socket: public ipstream{public:    client_socket();};client_socket::client_socket()    : ipstream(){    // sets both input and output buffer sizes    set_bufsize(SOCKET_BUF_SIZE);}void fail(const char* msg){    syslog_write(SYSLOG_FATAL, "%s", msg);    exit(2);}void run_server(){    ipstmserver server;    client_socket* client = new client_socket();    threads.set_capacity(cfg_max_clients * 2);    try    {        // listen to all local addresses on cfg_port        server.bindall(cfg_port);        syslog_write(SYSLOG_WARNING, "started, user=%s, port=%d, dir=%s",	    get_username(), cfg_port, pconst(cfg_document_root));        // try to listen on socket to give an error message        // before daemonizing        server.poll(-1, 0);        started = now();        // daemonize (has no effect on WIN32)        if (cfg_daemonize)        {            errlog = 0;            daemon(0, 0);        }#ifndef WIN32        // run-as (downgrade process priveleges)        if (!isempty(cfg_user))        {            int uid = get_user_id(cfg_user);            if (uid < 0)                fail("Unknown user: " + cfg_user);            int gid;            if (isempty(cfg_group))            {                gid = get_user_gid(cfg_user);                cfg_group = get_group_name(gid);            }            else                gid = get_group_id(cfg_group);            if (gid < 0)                fail("Unknown group: " + cfg_group);            if (setgid(gid) < 0)                fail("Couldn't change effective user/group ID (not root?)");            if (initgroups(cfg_user, gid))                fail("initgroups() failed"); // what else can we say here?            if (setuid(uid) < 0)                fail("Couldn't change effective user ID (not root?)");            syslog_write(SYSLOG_WARNING, "running as %s:%s",                pconst(cfg_user), pconst(cfg_group));        }#endif        while (true)        {            // wait infinitely for a connection request            server.serve(*client);                        if (client->get_active())            {                if (thread_count >= cfg_max_clients * 2)                {                    // critical situation: the number of threads is twice as                    // more than allowed                    client->close();                    syslog_write(SYSLOG_WARNING, "critical number of clients reached (%d * 2), aborting connection", cfg_max_clients);                }                else                {                    // start a new thread for this connection                    client_thread* conn = new client_thread(client);                    client = 0;                    // start and forget; the thread object will free itself                    conn->start();                    client = new client_socket();                }            }        }    }    catch(estream* e)    {        fail("Server socket error: " + e->get_message());	delete e;    }}void config_check(){    cfg_document_root = absolute_path(cfg_document_root);    if (trail_char(cfg_document_root) == '/')    {#ifdef WIN32        if (length(cfg_document_root) > 3)  // "c:/" or "///" ?#else        if (length(cfg_document_root) > 1)  // "/" ?#endif            trunc_trail_char(cfg_document_root);    }    if (isempty(cfg_document_root) || !is_directory(cfg_document_root))        fail("Document root directory not found");    if (cfg_port <= 0)        fail("Invalid port number");    if (!isempty(cfg_log_file))    {        htlog = new logfile(cfg_log_file, true);        try        {            htlog->open();        }        catch (estream* e)        {            fail(e->get_message());            delete e;        }    }    else if (cfg_daemonize)        syslog_write(SYSLOG_WARNING, "daemon started without a HTTP access log");    if (cfg_max_clients <= 0)        fail("Invalid maximum number of clients");}int main(int argc, char* argv[]){    cfg_server_name = get_nodename();    config_init(argc, argv);    log_init();    config_check();    init_handlers();    run_server();    // currently we never reach this point    log_done();    config_done();    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -