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; }
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); } }