|
@@ -0,0 +1,164 @@
|
|
|
+#include "service_maintain.h"
|
|
|
+
|
|
|
+#include <iostream>
|
|
|
+#include <QFile>
|
|
|
+
|
|
|
+service_maintain::service_maintain(iv::service_maintain_param & param)
|
|
|
+{
|
|
|
+ mparam = param;
|
|
|
+
|
|
|
+ mpServer = new QUdpSocket(this);
|
|
|
+
|
|
|
+ mpServer->bind(QHostAddress::Any,std::atoi(mparam.mstrlistenport.data()));
|
|
|
+
|
|
|
+ connect(mpServer,SIGNAL(readyRead()),this,SLOT(onRecvData()));
|
|
|
+
|
|
|
+ StartService();
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void service_maintain::onRecvData()
|
|
|
+{
|
|
|
+ while(mpServer->hasPendingDatagrams())
|
|
|
+ {
|
|
|
+ QByteArray ba;
|
|
|
+ ba.resize(mpServer->bytesAvailable());
|
|
|
+ QHostAddress host;
|
|
|
+ quint16 port;
|
|
|
+ mpServer->readDatagram(ba.data(),ba.size(),&host,&port);
|
|
|
+ std::cout<<" recevive data from "<<host.toString().toLatin1().data()<<":"<<port<<" data size: "<<ba.size()<<std::endl;
|
|
|
+ ProcessData(ba);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+int service_maintain::generateRandomNumber()
|
|
|
+{
|
|
|
+ qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
|
|
|
+ int nrtn = qrand()%1000;
|
|
|
+ std::cout<<" rand value: "<<nrtn<<std::endl;
|
|
|
+ return nrtn;
|
|
|
+}
|
|
|
+
|
|
|
+void service_maintain::ProcessData(QByteArray & ba)
|
|
|
+{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void service_maintain::StartService()
|
|
|
+{
|
|
|
+ if((mnServiceCode > 0)&&(mnServcieStatus == 1))
|
|
|
+ {
|
|
|
+ std::cout<<" Service is opened. "<<std::endl;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ int nport = generateRandomNumber();
|
|
|
+ nport = nport + 14000;
|
|
|
+ mnServiceCode = nport;
|
|
|
+
|
|
|
+ std::string strfrpc = mparam.mstrfrpcfolder + "/frpc";
|
|
|
+ QFileInfo xFileInfo(strfrpc.data());
|
|
|
+ if(xFileInfo.exists() == false)
|
|
|
+ {
|
|
|
+ mnServiceCode = -1;
|
|
|
+ mstrError = "No frpc program.";
|
|
|
+ mnServcieStatus = 0;
|
|
|
+ std::cout<<"No frpc program."<<std::endl;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(xFileInfo.isExecutable() == false)
|
|
|
+ {
|
|
|
+ mnServiceCode = -1;
|
|
|
+ mstrError = "frpc program is not executable.";
|
|
|
+ mnServcieStatus = 0;
|
|
|
+ std::cout<<"frpc program is not executable."<<std::endl;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ CreateIniFile();
|
|
|
+
|
|
|
+ if(mnServiceCode > 0)
|
|
|
+ {
|
|
|
+ mpfrpProcess = new QProcess(this);
|
|
|
+
|
|
|
+
|
|
|
+ connect(mpfrpProcess,SIGNAL(started()),this,SLOT(onProcessStarted()));
|
|
|
+ connect(mpfrpProcess,SIGNAL(finished(int)),this,SLOT(onProcessEnd()));
|
|
|
+ connect(mpfrpProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(onReadStandardOutput()));
|
|
|
+ connect(mpfrpProcess,SIGNAL(readyReadStandardError()),this,SLOT(onReadStandardError()));
|
|
|
+
|
|
|
+
|
|
|
+ // connect(mpfrpProcess,SIGNAL(error(QProcess::ProcessError)),this,SLOT(onProcessErrorStarted(QProcess::ProcessError)));
|
|
|
+
|
|
|
+
|
|
|
+ char strcmd[1000];
|
|
|
+ snprintf(strcmd,1000,"%s/frpc -c %s",mparam.mstrfrpcfolder.data(), mstrIniFile.data());
|
|
|
+
|
|
|
+ std::cout<<" cmd: "<<strcmd<<std::endl;
|
|
|
+
|
|
|
+ mpfrpProcess->start(strcmd);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+std::string service_maintain::CreateIniFile()
|
|
|
+{
|
|
|
+ std::string strfilepath = mparam.mstrfrpcfolder + "/frpc" + QString::number(std::chrono::system_clock::now().time_since_epoch().count() ).toStdString() + ".ini";
|
|
|
+ mstrIniFile = strfilepath;
|
|
|
+ QFile xFile;
|
|
|
+ xFile.setFileName(strfilepath.data());
|
|
|
+ if(!xFile.open(QIODevice::ReadWrite))
|
|
|
+ {
|
|
|
+ mnServiceCode = -1;
|
|
|
+ mnServcieStatus = 0;
|
|
|
+ mstrError = "Can't Create ini file.";
|
|
|
+ std::cout<<"Can't Create ini file."<<std::endl;
|
|
|
+ return mstrIniFile;
|
|
|
+ }
|
|
|
+ char strline[1000];
|
|
|
+ snprintf(strline,1000,"[common]\n");xFile.write(strline,strnlen(strline,1000));
|
|
|
+ snprintf(strline,1000,"server_addr = %s\n",mparam.mstrserverip.data());xFile.write(strline,strnlen(strline,1000));
|
|
|
+ snprintf(strline,1000,"server_port = %s\n",mparam.mstrserverport.data());xFile.write(strline,strnlen(strline,1000));
|
|
|
+ snprintf(strline,1000,"token = %s\n",mparam.mstrtoken.data());xFile.write(strline,strnlen(strline,1000));
|
|
|
+ snprintf(strline,1000,"\n");xFile.write(strline,strnlen(strline,1000));
|
|
|
+ snprintf(strline,1000,"[nomachine_tcp]\n");xFile.write(strline,strnlen(strline,1000));
|
|
|
+ snprintf(strline,1000,"type = tcp\n");xFile.write(strline,strnlen(strline,1000));
|
|
|
+ snprintf(strline,1000,"local_ip = 127.0.0.1\n");xFile.write(strline,strnlen(strline,1000));
|
|
|
+ snprintf(strline,1000,"local_port = %s\n",mparam.mstrnomachineport.data());xFile.write(strline,strnlen(strline,1000));
|
|
|
+ snprintf(strline,1000,"remote_port = %d\n",mnServiceCode);xFile.write(strline,strnlen(strline,1000));
|
|
|
+ xFile.close();
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void service_maintain::onProcessStarted()
|
|
|
+{
|
|
|
+ std::cout<<" Started. "<<std::endl;
|
|
|
+}
|
|
|
+
|
|
|
+void service_maintain::onProcessEnd()
|
|
|
+{
|
|
|
+ QProcess * proc = (QProcess *)sender();
|
|
|
+}
|
|
|
+
|
|
|
+void service_maintain::onChRead()
|
|
|
+{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void service_maintain::onReadStandardOutput()
|
|
|
+{
|
|
|
+ QProcess * proc = (QProcess *)sender();
|
|
|
+ QByteArray ba = proc->readAllStandardOutput();
|
|
|
+ std::cout<<"Std Out:"<<std::endl;
|
|
|
+ std::cout<<ba.data()<<std::endl;
|
|
|
+}
|
|
|
+
|
|
|
+void service_maintain::onReadStandardError()
|
|
|
+{
|
|
|
+ QProcess * proc = (QProcess *)sender();
|
|
|
+ QByteArray ba = proc->readAllStandardError();
|
|
|
+ std::cout<<"Error Out:"<<std::endl;
|
|
|
+ std::cout<<ba.data()<<std::endl;
|
|
|
+}
|
|
|
+
|