spwtcppacketserver.cpp
163 lines
| 4.8 KiB
| text/x-c
|
CppLexer
r14 | /*------------------------------------------------------------------------------ | |||
-- This file is a part of the SocExplorer Software | ||||
-- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | ||||
-- | ||||
-- This program is free software; you can redistribute it and/or modify | ||||
-- it under the terms of the GNU General Public License as published by | ||||
-- the Free Software Foundation; either version 3 of the License, or | ||||
-- (at your option) any later version. | ||||
-- | ||||
-- This program is distributed in the hope that it will be useful, | ||||
-- but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
-- GNU General Public License for more details. | ||||
-- | ||||
-- You should have received a copy of the GNU General Public License | ||||
-- along with this program; if not, write to the Free Software | ||||
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||||
-------------------------------------------------------------------------------*/ | ||||
/*-- Author : Alexis Jeandet | ||||
-- Mail : alexis.jeandet@member.fsf.org | ||||
----------------------------------------------------------------------------*/ | ||||
Jeandet Alexis
|
r12 | #include "spwtcppacketserver.h" | ||
#include "ui_spwtcppacketserver.h" | ||||
Jeandet Alexis
|
r20 | #include <QNetworkInterface> | ||
#include <QByteArray> | ||||
Jeandet Alexis
|
r12 | |||
SpwTcpPacketServer::SpwTcpPacketServer(QWidget *parent) : | ||||
QWidget(parent), | ||||
ui(new Ui::SpwTcpPacketServer) | ||||
{ | ||||
ui->setupUi(this); | ||||
Jeandet Alexis
|
r18 | this->p_bridge = NULL; | ||
this->p_server = new QTcpServer(); | ||||
connect(this->ui->startServeQpb,SIGNAL(clicked(bool)),SLOT(toggleServer())); | ||||
Jeandet Alexis
|
r20 | updateHostIP(); | ||
this->ui->PortLineEdit->setText("2200"); | ||||
r21 | connect(this->p_server,SIGNAL(newConnection()),this,SLOT(newConnection())); | |||
Jeandet Alexis
|
r12 | } | ||
SpwTcpPacketServer::~SpwTcpPacketServer() | ||||
{ | ||||
delete ui; | ||||
} | ||||
Jeandet Alexis
|
r18 | |||
void SpwTcpPacketServer::setBridge(abstractSpwBridge *bridge) | ||||
{ | ||||
if(this->p_bridge!=NULL) | ||||
{ | ||||
disconnect(this,SLOT(pushPacket(char*,int))); | ||||
} | ||||
this->p_bridge = bridge; | ||||
connect(bridge,SIGNAL(pushPacketOverTCP(char*,int)),SLOT(pushPacket(char*,int))); | ||||
} | ||||
void SpwTcpPacketServer::pushPacket(char *packet, int size) | ||||
{ | ||||
Jeandet Alexis
|
r20 | QByteArray data; | ||
char sizech[3]; | ||||
data.append((char)0); | ||||
sizech[0]=size & 0x0FF; | ||||
sizech[1]=(size>>8) & 0x0FF; | ||||
sizech[2]=(size>>16) & 0x0FF; | ||||
data.append(sizech,3); | ||||
data.append(packet,size); | ||||
for(int i=0;i<connectedClients.count();i++) | ||||
{ | ||||
QTcpSocket* soc=connectedClients.at(i); | ||||
if(soc->state()!=QAbstractSocket::ConnectedState) | ||||
{ | ||||
connectedClients.removeAt(i); | ||||
delete soc; | ||||
} | ||||
else | ||||
{ | ||||
connectedClients.at(i)->write(data); | ||||
} | ||||
} | ||||
Jeandet Alexis
|
r22 | free(packet); | ||
Jeandet Alexis
|
r18 | } | ||
void SpwTcpPacketServer::toggleServer() | ||||
{ | ||||
if(this->p_server->isListening()) | ||||
{ | ||||
Jeandet Alexis
|
r20 | disconnectServer(); | ||
Jeandet Alexis
|
r18 | } | ||
else | ||||
{ | ||||
Jeandet Alexis
|
r20 | connectServer(); | ||
Jeandet Alexis
|
r18 | } | ||
} | ||||
Jeandet Alexis
|
r20 | |||
void SpwTcpPacketServer::connectServer() | ||||
{ | ||||
this->p_server->listen(QHostAddress::Any,this->ui->PortLineEdit->text().toInt()); | ||||
this->ui->startServeQpb->setText("Stop Server"); | ||||
} | ||||
void SpwTcpPacketServer::disconnectServer() | ||||
{ | ||||
this->ui->startServeQpb->setText("Start Server"); | ||||
this->p_server->close(); | ||||
} | ||||
void SpwTcpPacketServer::setServerPort(qint32 port) | ||||
{ | ||||
this->ui->PortLineEdit->setText(QString("%1").arg(port)); | ||||
} | ||||
r21 | void SpwTcpPacketServer::setServerSetIP(QString ip) | |||
{ | ||||
this->ui->IPLineEdit->setText(ip); | ||||
} | ||||
Jeandet Alexis
|
r20 | void SpwTcpPacketServer::newConnection() | ||
{ | ||||
Jeandet Alexis
|
r22 | QTcpSocket* soc=this->p_server->nextPendingConnection(); | ||
this->connectedClients.append(soc); | ||||
r21 | this->ui->listWidget->addItem(this->connectedClients.last()->peerAddress().toString()); | |||
Jeandet Alexis
|
r22 | connect(soc,SIGNAL(readyRead()),this,SLOT(readReady())); | ||
} | ||||
void SpwTcpPacketServer::readReady() | ||||
{ | ||||
for(int i=0;i<connectedClients.count();i++) | ||||
{ | ||||
QTcpSocket* soc=connectedClients.at(i); | ||||
if(soc->state()!=QAbstractSocket::ConnectedState) | ||||
{ | ||||
connectedClients.removeAt(i); | ||||
delete soc; | ||||
} | ||||
else | ||||
{ | ||||
if(soc->bytesAvailable()!=0) | ||||
{ | ||||
do | ||||
{ | ||||
QByteArray data = soc->readAll(); | ||||
if(data[0]==0) | ||||
{ | ||||
int size = (data[1]*256*256) + (data[2]*256) + data[3]; | ||||
char* SPWpacket = (char*)malloc(size); | ||||
memcpy(SPWpacket,data.data()+4,size); | ||||
emit sendSPWPacket(SPWpacket,size); | ||||
} | ||||
}while(soc->bytesAvailable()!=0); | ||||
} | ||||
} | ||||
} | ||||
Jeandet Alexis
|
r20 | } | ||
void SpwTcpPacketServer::updateHostIP() | ||||
{ | ||||
QList<QHostAddress> list = QNetworkInterface::allAddresses(); | ||||
for(int nIter=0; nIter<list.count(); nIter++) | ||||
{ | ||||
if(!list[nIter].isLoopback()) | ||||
if (list[nIter].protocol() == QAbstractSocket::IPv4Protocol ) | ||||
this->ui->IPLineEdit->setText(list[nIter].toString()); | ||||
} | ||||
} | ||||