proto-debuger/protoDebuger/network_controller.cpp

201 lines
5.4 KiB
C++
Raw Normal View History

2021-04-24 17:21:31 +00:00
#include "network_controller.h"
2021-05-03 08:49:33 +00:00
NetworkController::NetworkType NetworkController::Type()
{
return mType;
}
NetworkController::NetworkController(NetworkController::NetworkType type,
2021-05-03 05:50:07 +00:00
QString ip,
2021-08-29 08:13:50 +00:00
uint16_t port):
mTcp(nullptr),
2021-05-03 05:50:07 +00:00
mUDP(nullptr),
mTcpServer(nullptr),
2021-05-03 15:07:13 +00:00
mCnn(nullptr),
mState(false)
2021-04-24 17:21:31 +00:00
{
2021-05-02 18:02:25 +00:00
mType = type;
if(_checkType(type) == TYPE_UNKOWN){
}
2021-05-03 08:49:33 +00:00
if(type == NetworkType::TYPE_TCP_CLIENT){
2021-04-24 17:21:31 +00:00
mTcp = new QTcpSocket();
mCnn = mTcp;
2021-08-29 08:13:50 +00:00
QObject::connect(mTcp, SIGNAL(connected()), this, SLOT(on_conected()));
2021-04-24 17:21:31 +00:00
QObject::connect(mTcp, SIGNAL(readyRead()), this, SLOT(on_ready_read()));
QObject::connect(mTcp, SIGNAL(disconnected()), this, SLOT(on_disconect()));
2021-08-29 15:50:41 +00:00
QObject::connect(mTcp, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
this, SLOT(tcpsock_stateChanged(QAbstractSocket::SocketState)));
2021-04-24 17:21:31 +00:00
2021-08-29 08:13:50 +00:00
mTcp->connectToHost(ip,port,QIODevice::ReadWrite,QAbstractSocket::IPv4Protocol);
2021-06-30 16:50:13 +00:00
qDebug()<<mTcp->state();
2021-08-29 15:50:41 +00:00
2021-05-03 15:07:13 +00:00
if(mTcp->state() == QAbstractSocket::ConnectedState)
mState = true;
2021-04-24 17:21:31 +00:00
}
2021-05-02 18:02:25 +00:00
2021-05-03 08:49:33 +00:00
if(type == NetworkType::TYPE_TCP_SERVER){
2021-09-07 17:06:03 +00:00
qDebug()<<"tcp server mode";
2021-05-02 18:02:25 +00:00
mTcpServer = new QTcpServer();
connect(mTcpServer,SIGNAL(newConnection()),
this,SLOT(on_server_accept()));
2021-09-01 16:16:47 +00:00
connect(mTcpServer, SIGNAL(acceptError(QAbstractSocket::SocketError )),
this, SLOT( on_accept_error(QAbstractSocket::SocketError )));
2021-05-02 18:02:25 +00:00
if (!mTcpServer->listen(QHostAddress::Any, port))
{
qDebug() << "m_pTcpServer->listen() error";
}
}
2021-08-29 08:13:50 +00:00
if((type == NetworkType::TYPE_UDP_SERVER) || (type == NetworkType::TYPE_UDP_CLIENT)){
2021-05-03 05:50:07 +00:00
mUDP = new QUdpSocket(this);
2021-05-03 06:07:04 +00:00
mUDP->bind(QHostAddress::Any, port);
2021-05-03 05:50:07 +00:00
mCnn = mUDP;
connect(mUDP, SIGNAL(readyRead()),
this, SLOT(on_ready_read()));
2021-05-03 06:07:04 +00:00
mUDP->open(QIODevice::ReadWrite);
2021-05-03 15:07:13 +00:00
mState = true;
2021-05-03 05:50:07 +00:00
}
2021-05-02 18:02:25 +00:00
2021-04-24 17:21:31 +00:00
}
2021-04-29 14:26:45 +00:00
int NetworkController::SendData(int8_t *data, uint32_t len)
{
2021-05-01 15:41:40 +00:00
if(nullptr == data)
return -1;
return mCnn->write((const char *)data,len);
2021-04-29 14:26:45 +00:00
}
2021-05-03 08:49:33 +00:00
NetworkController::RecvResult NetworkController::ReadData(int8_t *data)
2021-04-24 17:21:31 +00:00
{
2021-05-03 08:49:33 +00:00
RecvResult ret;
if(nullptr == data){
ret.len = -1;
return ret;
}
if((mType == TYPE_UDP_CLIENT )||(mType == TYPE_UDP_SERVER)){
int len = 0;
2021-08-31 14:23:45 +00:00
if(mUDP->hasPendingDatagrams()){
2021-05-03 08:49:33 +00:00
QNetworkDatagram datagram = mUDP->receiveDatagram();
2021-08-31 14:23:45 +00:00
memcpy(data,datagram.data().data(),datagram.data().size());
2021-05-03 08:49:33 +00:00
len += datagram.data().size();
ret.addr = datagram.senderAddress().toString();
ret.port = datagram.senderPort();
2021-08-31 14:23:45 +00:00
ret.len = datagram.data().length();
2021-05-03 08:49:33 +00:00
}
}
else{
2021-09-01 16:16:47 +00:00
auto reads = mCnn->readAll();
memcpy(data,reads.data(),reads.size());
ret.len = reads.size();
2021-05-01 15:41:40 +00:00
}
2021-05-03 08:49:33 +00:00
return ret;
2021-05-01 15:41:40 +00:00
}
2021-05-03 05:50:07 +00:00
int NetworkController::Close()
{
if(mType == TYPE_TCP_SERVER){
mTcpServer->close();
if(nullptr != mCnn)
mCnn->close();
delete mTcpServer;
2021-08-29 08:13:50 +00:00
mTcpServer = nullptr;
mCnn = nullptr;
2021-09-01 16:16:47 +00:00
mTcp = nullptr;
2021-05-03 05:50:07 +00:00
}
if(mType == TYPE_TCP_CLIENT){
2021-06-30 16:50:13 +00:00
qDebug()<<(((QTcpSocket*)mTcp)->state());
qDebug()<<"disconnected"<<mTcp->bytesAvailable()<<mCnn->bytesToWrite();
((QTcpSocket*)mTcp)->disconnectFromHost();
if(((QTcpSocket*)mTcp)->waitForDisconnected(3000));
mTcp->close();
delete mTcp;
2021-08-29 08:13:50 +00:00
mTcp = nullptr;
2021-05-03 05:50:07 +00:00
}
2021-05-03 15:07:13 +00:00
mState = false;
2021-05-03 05:50:07 +00:00
return 0;
}
2021-05-01 15:41:40 +00:00
NetworkController::~NetworkController()
{
2021-08-29 08:13:50 +00:00
if(mState){
if(mTcp != nullptr)
delete mTcp;
if((mCnn != nullptr) && (this->mType != NetworkType::TYPE_TCP_CLIENT))
delete mCnn;
if(mTcpServer != nullptr)
delete mTcpServer;
if(mUDP != nullptr)
delete mUDP;
}
}
2021-08-29 15:50:41 +00:00
2021-08-29 08:13:50 +00:00
bool NetworkController::State()
{
return this->mState;
}
void NetworkController::on_conected()
{
mState = true;
2021-08-29 15:50:41 +00:00
emit(on_connected());
}
void NetworkController::tcpsock_stateChanged(QAbstractSocket::SocketState state)
{
qDebug()<<state;
if(state == QAbstractSocket::SocketState::UnconnectedState){
emit(on_disconnectd());
}
2021-04-24 17:21:31 +00:00
}
2021-04-29 14:26:45 +00:00
void NetworkController::on_ready_read()
2021-04-24 17:21:31 +00:00
{
2021-05-02 18:02:25 +00:00
emit(on_data_recv());
2021-04-24 17:21:31 +00:00
}
2021-04-29 14:26:45 +00:00
void NetworkController::on_disconect()
2021-04-24 17:21:31 +00:00
{
2021-05-01 15:41:40 +00:00
qDebug()<<"close";
2021-05-02 18:02:25 +00:00
if(nullptr != mCnn){
mCnn->close();
2021-05-03 05:50:07 +00:00
emit(this->on_conection_close());
}
2021-09-01 16:16:47 +00:00
// if(mType == TYPE_TCP_SERVER){
// mTcpServer->resumeAccepting();
// }
2021-04-24 17:21:31 +00:00
}
2021-05-02 18:02:25 +00:00
void NetworkController::on_server_accept()
{
if(mType == TYPE_TCP_SERVER){
QTcpSocket* pClientConnection = mTcpServer->nextPendingConnection();
if(nullptr != pClientConnection){
QObject::connect(pClientConnection, SIGNAL(readyRead()), this, SLOT(on_ready_read()));
QObject::connect(pClientConnection, SIGNAL(disconnected()), this, SLOT(on_disconect()));
}
qDebug()<<pClientConnection->socketDescriptor();
// mTcp = pClientConnection;
// mCnn = mTcp;
2021-05-03 15:07:13 +00:00
mState = true;
2021-09-01 16:16:47 +00:00
emit(on_connected());
2021-05-02 18:02:25 +00:00
}
}
2021-05-03 05:50:07 +00:00
void NetworkController::on_accept_error(QAbstractSocket::SocketError socketError)
{
qDebug()<<socketError;
}
2021-05-03 08:49:33 +00:00
NetworkController::NetworkType NetworkController::_checkType(NetworkType type){
2021-05-02 18:02:25 +00:00
if(type < TYPE_UNKOWN){
return type;
}else{
return TYPE_UNKOWN;
}
}