aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/qlicenseservice/tcpserver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/qlicenseservice/tcpserver.cpp')
-rw-r--r--src/libs/qlicenseservice/tcpserver.cpp51
1 files changed, 27 insertions, 24 deletions
diff --git a/src/libs/qlicenseservice/tcpserver.cpp b/src/libs/qlicenseservice/tcpserver.cpp
index 330ad07..565f43a 100644
--- a/src/libs/qlicenseservice/tcpserver.cpp
+++ b/src/libs/qlicenseservice/tcpserver.cpp
@@ -8,6 +8,20 @@
namespace QLicenseService {
TcpServer::TcpServer(uint16_t serverPort)
+ : m_serverPort(serverPort)
+{
+}
+
+TcpServer::~TcpServer()
+{
+ doCloseSocket(m_masterSocket);
+ for (type_socket sd: m_clientSocket) {
+ doCloseSocket(sd);
+ }
+ m_clientSocket.clear();
+}
+
+bool TcpServer::init()
{
int opt = TRUE;
@@ -18,19 +32,19 @@ TcpServer::TcpServer(uint16_t serverPort)
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"Error at WSAStartup()\n");
- exit(EXIT_FAILURE);
+ return false;
}
#endif
// Create a master socket
if ((m_masterSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == 0) {
perror("socket failed");
- exit(EXIT_FAILURE);
+ return false;
}
// Set master socket to allow multiple connections
if (setsockopt(m_masterSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt,
sizeof(opt)) < 0) {
perror("setsockopt failed");
- exit(EXIT_FAILURE);
+ return false;
}
timeval tv {1, 0}; //t.tv_sec = 2; t.tv_usec = 0;
int ret = setsockopt(m_masterSocket, SOL_SOCKET, SO_RCVTIMEO,
@@ -43,42 +57,31 @@ TcpServer::TcpServer(uint16_t serverPort)
// Type of socket created
m_address.sin_family = AF_INET;
m_address.sin_addr.s_addr = INADDR_ANY;
- m_address.sin_port = htons(serverPort);
+ m_address.sin_port = htons(m_serverPort);
// Bind the socket to localhost
if (bind(m_masterSocket, (struct sockaddr *)&m_address, sizeof(m_address)) < 0) {
doCloseSocket(m_masterSocket);
perror("bind failed");
- exit(EXIT_FAILURE);
+ return false;
}
- std::cout << "Listening to port " << serverPort << std::endl;
+ std::cout << "Listening to port " << m_serverPort << std::endl;
//ioctlsocket(m_masterSocket, FIONBIO, &mode);
// Try to specify maximum of 3 pending connections for the master socket
if (listen(m_masterSocket, 3) < 0) {
doCloseSocket(m_masterSocket);
perror("listen");
- exit(EXIT_FAILURE);
+ return false;
}
m_addrlen = sizeof(m_address);
// Accept the incoming connection
std::cout << "Waiting for connections ...\n";
+ return true;
}
-TcpServer::~TcpServer()
+bool TcpServer::listenToClients(uint16_t &socketId, std::string *data)
{
- doCloseSocket(m_masterSocket);
- for (type_socket sd: m_clientSocket) {
- doCloseSocket(sd);
- }
- m_clientSocket.clear();
-}
-
-
-std::string TcpServer::listenToClients(uint16_t &socketId)
-{
- std::string data;
-
// Clear the socket set
FD_ZERO(&m_readfds);
@@ -111,7 +114,7 @@ std::string TcpServer::listenToClients(uint16_t &socketId)
if ((new_socket = accept(m_masterSocket,
(struct sockaddr *)&m_address, (socklen_t *)&m_addrlen)) < 0) {
perror("accept");
- exit(EXIT_FAILURE);
+ return false;
}
// Add new socket to set of sockets
m_clientSocket.insert(new_socket);
@@ -133,17 +136,17 @@ std::string TcpServer::listenToClients(uint16_t &socketId)
getpeername(sd, (struct sockaddr *)&m_address,
(socklen_t *)&m_addrlen);
socketId = sd;
- data = SOCKET_CLOSED_MSG;
+ *data = SOCKET_CLOSED_MSG;
} else {
// Set the string terminating NULL byte
// on the end of the data read
m_buffer[valread] = '\0';
socketId = sd;
- data = m_buffer;
+ *data = m_buffer;
}
}
}
- return data;
+ return true;
}
int TcpServer::sendResponse(int socketId, const std::string &message)