-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathtcpserver.cpp
111 lines (97 loc) · 2.36 KB
/
tcpserver.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/************************************************************************//**
*
* \file tcpserver.cpp
* \brief Simple QT TCP server
* \author marc at pignat dot org
*
****************************************************************************
*
* Copyright 2015,2016 Marc Pignat
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* See the License for the specific language governing permissions and
* limitations under the License.
*
***************************************************************************/
#include "tcpserver.h"
#include <QDebug>
TcpServer::TcpServer(QObject *parent) :
QObject(parent)
{
}
int TcpServer::start()
{
server = new QTcpServer(this);
// whenever a user connects, it will emit signal
connect(server, SIGNAL(newConnection()),
this, SLOT(newConnection()));
if(!server->listen(QHostAddress::Any, 9999))
{
qDebug() << "Server could not start, listen failed";
return -1;
}
else
{
qDebug() << "Server started!";
}
return 0;
}
void TcpServer::quit()
{
qDebug() << "server stopped";
server->close();
}
void TcpServer::tx(const quint8 *data, quint64 size)
{
// qDebug() << "tx:data.length:" << data.length();
if (size != 510)
{
//qDebug() << "tx:data.length:" << data.length();
}
if (size == 0)
{
qDebug() << "tx:size:" << size;
}
foreach(QTcpSocket *s, clients)
{
s->write((const char *)data, size);
}
}
void TcpServer::disconnected()
{
QTcpSocket* client = static_cast<QTcpSocket*>(QObject::sender());
clients.removeOne(client);
}
void TcpServer::rxReady()
{
QTcpSocket* client = static_cast<QTcpSocket*>(QObject::sender());
quint8 buffer[512];
for (;;)
{
quint64 size = client->read((char *)buffer, sizeof(buffer));
if (size == 0)
{
break;
}
else
emit rx(buffer, size);
}
}
void TcpServer::newConnection()
{
// need to grab the socket
QTcpSocket *socket = server->nextPendingConnection();
clients.push_back(socket);
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
connect(socket, SIGNAL(readyRead()), this, SLOT(rxReady()));
}
TcpServer::~TcpServer()
{
}