Пример #1
0
int main(int argc, char *argv[])
{
    bool gui = false;
    QApplication app(argc, argv, gui);
    QProxyStyle * style = new QProxyStyle();
    app.setStyle(style);

    struct statsd_info
    {
        statsd_info() : host("127.0.0.1"), port(8125), ns(std::string(ICHABOD_NAME)+"."), enabled(false) {}
        std::string host;
        int port;
        std::string ns;
        bool enabled;
    };
    statsd_info statsd;

    int port = 9090;
    QStringList args = app.arguments();
    QRegExp rxPort("--port=([0-9]{1,})");
    QRegExp rxVerbose("--verbosity=([0-9]{1,})");
    QRegExp rxEngineVerbose("--engine-verbosity=([0-9]{1,})");
    QRegExp rxConvertVerbose("--convert-verbosity=([0-9]{1,})");
    QRegExp rxSlowResponseMs("--slow-response-ms=([0-9]{1,})");
    QRegExp rxQuantize("--quantize=([a-zA-Z]{1,})");
    QRegExp rxVersion("--version");
    QRegExp rxShortVersion("-v$");
    QRegExp rxStatsdHost("--statsd-host=([^ ]+)");
    QRegExp rxStatsdPort("--statsd-port=([0-9]{1,})");
    QRegExp rxStatsdNs("--statsd-ns=([^ ]+)");

    for (int i = 1; i < args.size(); ++i) {
        if (rxPort.indexIn(args.at(i)) != -1 )
        {
            port =  rxPort.cap(1).toInt();
        }
        else if (rxVerbose.indexIn(args.at(i)) != -1 )
        {
            g_verbosity = rxVerbose.cap(1).toInt();
        }
        else if (rxEngineVerbose.indexIn(args.at(i)) != -1 )
        {
            g_engine_verbosity = rxEngineVerbose.cap(1).toInt();
        }
        else if (rxConvertVerbose.indexIn(args.at(i)) != -1 )
        {
            g_convert_verbosity = rxConvertVerbose.cap(1).toInt();
        }
        else if (rxSlowResponseMs.indexIn(args.at(i)) != -1 )
        {
            g_slow_response_ms = rxSlowResponseMs.cap(1).toInt();
        }
        else if (rxQuantize.indexIn(args.at(i)) != -1 )
        {
            g_quantize = rxQuantize.cap(1);
        }
        else if (rxVersion.indexIn(args.at(i)) != -1 )
        {
            std::cout << ICHABOD_NAME << " version " << ICHABOD_VERSION << std::endl;
            std::cout << "** The GIFLIB distribution is Copyright (c) 1997  Eric S. Raymond" << std::endl;
            std::cout << "** ppmquant is Copyright (C) 1989, 1991 by Jef Poskanzer." << std::endl;
            std::cout << "** statsd-client-cpp is Copyright (c) 2014, Rex" << std::endl;
            std::cout << "**" << std::endl;
            std::cout << "** Permission to use, copy, modify, and distribute this software and its" << std::endl;
            std::cout << "** documentation for any purpose and without fee is hereby granted, provided" << std::endl;
            std::cout << "** that the above copyright notice appear in all copies and that both that" << std::endl;
            std::cout << "** copyright notice and this permission notice appear in supporting" << std::endl;
            std::cout << "** documentation.  This software is provided \"as is\" without express or" << std::endl;
            std::cout << "** implied warranty." << std::endl;
            std::cout << "**" << std::endl;
            ppm_init( &argc, argv );
            return 0;
        }
        else if (rxShortVersion.indexIn(args.at(i)) != -1)
        {
            std::cout << ICHABOD_VERSION << std::endl;
            return 0;
        }
        else if (rxStatsdHost.indexIn(args.at(i)) != -1)
        {
            statsd.host = rxStatsdHost.cap(1).toLocal8Bit().constData();
            statsd.enabled = true;
        }
        else if (rxStatsdPort.indexIn(args.at(i)) != -1)
        {
            statsd.port = rxStatsdPort.cap(1).toInt();
            statsd.enabled = true;
        }
        else if (rxStatsdNs.indexIn(args.at(i)) != -1)
        {
            statsd.ns = rxStatsdNs.cap(1).toLocal8Bit().constData();
            if ( statsd.ns.length() && *statsd.ns.rbegin() != '.' )
            {
                statsd.ns += ".";
            }
            statsd.enabled = true;
        }
        else
        {
            std::cerr << "Unknown arg:" << args.at(i).toLocal8Bit().constData() << std::endl;
            return -1;
        }
    }

    ppm_init( &argc, argv );

    struct mg_server *server = mg_create_server(NULL, ev_handler);

    const char * err = mg_set_option(server, "listening_port", QString::number(port).toLocal8Bit().constData());
    if ( err )
    {
        std::cerr << "Cannot bind to port:" << port << " [" << err << "], exiting." << std::endl;
        return -1;
    }
    std::cout << ICHABOD_NAME << " " << ICHABOD_VERSION
              << " (port:" << mg_get_option(server, "listening_port")
              << " verbosity:" << g_verbosity
              << " engine verbosity:" << g_engine_verbosity
              << " convert verbosity:" << g_convert_verbosity
              << " slow-response:" << g_slow_response_ms << "ms";
    if ( statsd.enabled )
    {
        std::cout << " statsd:" << statsd.host << ":" << statsd.port << "[" << statsd.ns << "]";
        g_statsd.config(statsd.host, statsd.port, statsd.ns);
    }
    std::cout << ")" << std::endl;

    for (;;)
    {
        mg_poll_server(server, 1000);
    }

    mg_destroy_server(&server);

    return 0;
}
Пример #2
0
void Daemon::on_startListenButton_clicked()
{
    ip.clear();
    port.clear();
    ip = ui->ipLineEdit->text().trimmed();
    port = ui->portLineEdit->text().trimmed();

    if ( "开始监听" == ui->startListenButton->text() )
    {
        //close listening
       // server.close();
        //QMessageBox::critical( NULL, tr("提示"), tr("2.") );
        //udpSocket->close();

        //use regular expression to verify input information
        QRegExp rxIp("\\d+\\.\\d+\\.\\d+\\.\\d+");
        QRegExp rxPort(("[1-9]\\d{3,4}"));
        rxIp.setPatternSyntax(QRegExp::RegExp);
        rxPort.setPatternSyntax(QRegExp::RegExp);

        if ( !rxPort.exactMatch(port) ||  !rxIp.exactMatch(ip) )
        {
            QMessageBox::critical( NULL, tr("提示"), tr("请输入正确的IP和端口.") );
        }
        else
        {
            //Tells the server to listen for incoming connections on address address and port port
            if ( !server.listen( QHostAddress(ip), (quint16)port.toUInt() ) )
            {
                QMessageBox::critical(NULL, tr("提示"), tr("TCP监听失败: %1.").arg(server.errorString() ) );
            }
            else
            {
                //When Tcp listen established, then start Udp bind.

                udpSocket = new QUdpSocket(this);
                if ( !udpSocket->bind(QHostAddress(ip), (quint16)port.toUInt()+1 ) )
                {
                    QMessageBox::critical(NULL, tr("提示"), tr("UDP绑定失败: %1.").arg(udpSocket->errorString() ) );
                }
                connect(udpSocket, SIGNAL(readyRead()), this, SLOT(on_read_Datagrams()));

                ui->startListenButton->setText("断开监听");
                ui->ipLineEdit->setEnabled(false);
                ui->portLineEdit->setEnabled(false);
            }

        }
    }

    else if ( "断开监听" == ui->startListenButton->text() )
    {
        //close listening
        server.close();
        udpSocket->close();
        ui->startListenButton->setText("开始监听");
        ui->ipLineEdit->setEnabled(true);
        ui->portLineEdit->setEnabled(true);
    }

}