-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathtcpserver.cpp
136 lines (115 loc) · 2.31 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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include "tcpserver.h"
TCPServer::TCPServer(QObject *parent) :
QObject(parent)
{
port = 4444;
client = NULL;
server.setMaxPendingConnections(1);
connect(&server, SIGNAL(newConnection()), this, SLOT(newConnection()), Qt::QueuedConnection);
}
/**
* Set port to listen on
*/
void TCPServer::setPort(quint16 _port)
{
port = _port;
}
/**
* Start the server and wait for connections
*/
void TCPServer::start()
{
// listen on all addresses
server.listen(QHostAddress::Any, port);
if (!server.isListening()) {
emit connectionError(server.errorString());
return;
}
}
/**
* Stop the server and the connections
*/
void TCPServer::stop()
{
server.close();
endConnection();
}
/**
* Restart the client connection
*/
void TCPServer::clientStop()
{
if (client) {
if(client->state()) {
client->disconnectFromHost();
if (client->state() != QAbstractSocket::UnconnectedState) {
client->waitForDisconnected();
}
}
client->deleteLater();
client = NULL;
}
}
/**
* Set up the client tcp socket for an incoming connection
*/
void TCPServer::newConnection()
{
client = server.nextPendingConnection();
connect(client, SIGNAL(disconnected()), this, SLOT(endConnection()), Qt::QueuedConnection);
connect(client, SIGNAL(readyRead()), this, SLOT(clientReadString()), Qt::QueuedConnection);
emit connectionReady();
}
/**
* Disconnect client connection
*/
void TCPServer::endConnection()
{
if (client) {
client->deleteLater();
client = NULL;
}
emit connectionNotReady();
}
/**
* Send the string to the client
*/
void TCPServer::clientWriteString(QByteArray buffer)
{
if (client) {
client->write(buffer);
}
}
/**
* Receive a string from the client
*/
QByteArray TCPServer::clientReadString()
{
if (client) {
QByteArray buffer = client->read(1024*1024);
emit stringRead(buffer);
return buffer;
} else {
return "";
}
}
/**
* Get client IP
*/
QString TCPServer::getRemoteIp()
{
if (client) {
return client->peerAddress().toString();
}
return "";
}
/**
* Get client port
*/
quint16 TCPServer::getRemotePort()
{
if (client) {
return client->peerPort();
}
return 0;
}