#include "prot_cmdline.h" #include "base/mycfg.h" #include "QNetworkConfigurationManager" #include "QTimer" prot_cmdline_cb cmdline_find(myarray name) { extern const int __start_cmdldef; extern const int __stop_cmdldef; cmdline_def *start = (cmdline_def *)&__start_cmdldef; cmdline_def *end = (cmdline_def *)&__stop_cmdldef; cmdline_def *item = 0; for (item = start; item < end; item++) { if (item != nullptr) { if (name == item->cmd) return item->fun; // qDebug("if dev: %s",item->name); } } qWarning("can not find cmdline named '%s'", name.data()); return nullptr; } // 获取本机地址 static QString get_local_ip() { QList network = QNetworkInterface::allInterfaces(); foreach (QNetworkInterface net, network) { QString netName = net.humanReadableName(); if (netName == "eth0") { QList list = net.addressEntries(); // 获取IP地址与子掩码等 foreach (QNetworkAddressEntry address, list) { if (address.ip().protocol() == QAbstractSocket::IPv4Protocol) // 获取IPv4的地址 { return address.ip().toString(); } } } } return QString(); } void command::init_cb() { mycfg *cfg_ = syscfg(); if (get_local_ip().isEmpty()) { qDebug("modify local ip addr."); QString str = "ifconfig eth0 %1"; system(str.arg(cfg_->local_ip).toLocal8Bit().data()); str = "route add default gw %1"; system(str.arg(cfg_->gateway_ip).toLocal8Bit().data()); } if (socket_ == nullptr) { socket_ = new QUdpSocket(this); socket_->bind(QHostAddress::Any, cfg_->cmd_port); connect(socket_, &QUdpSocket::readyRead, this, &command::ready_read_cb); qInfo() << "udp command start."; qInfo() << "cmd port=" << cfg_->cmd_port; } } void command::send(QByteArray data) { if (socket_ == nullptr) return; if (data.back() != '\n') { data.append('\n'); } socket_->writeDatagram(data, host_addr, port); } static void cmdline_help(QList args); void command::ready_read_cb() { recv_data.resize(socket_->bytesAvailable()); socket_->readDatagram(recv_data.data(), recv_data.size(), &host_addr, &port); myarray cmd = recv_data.simplified(); QList args=cmd.split(' '); if(args.size()>0){ prot_cmdline_cb fun=cmdline_find(args[0]); if(fun!=nullptr){ fun(args); }else{ mystring str; str=mystring::asprintf("can not find command: %s",cmd.data()); send(str.data()); cmdline_help(args); } } qInfo() << "udp command." << cmd; recv_data.clear(); } static void cmdline_help(QList args) { command *c=command_start(); extern const int __start_cmdldef; extern const int __stop_cmdldef; cmdline_def *start = (cmdline_def *)&__start_cmdldef; cmdline_def *end = (cmdline_def *)&__stop_cmdldef; cmdline_def *item = 0; for (item = start; item < end; item++) { if (item != nullptr) { QByteArray send_data; send_data.append(item->cmd); send_data.append(30-send_data.size(),'.'); send_data.append(item->help); c->send(send_data); } } } cmdline_export(help,cmdline_help,print help information.); static command *g_command; static QThread g_thread; command *command_start() { if (g_command == nullptr) { g_command = new command(); g_command->moveToThread(&g_thread); QTimer::singleShot(0, g_command, &command::init_cb); g_thread.start(); } return g_command; }