diff options
Diffstat (limited to 'src/tcpclient.cpp')
-rw-r--r-- | src/tcpclient.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/tcpclient.cpp b/src/tcpclient.cpp new file mode 100644 index 0000000..1922b76 --- /dev/null +++ b/src/tcpclient.cpp @@ -0,0 +1,76 @@ +/* Copyright (C) 2022 The Qt Company Ltd. + * + * SPDX-License-Identifier: GPL-3.0-only WITH Qt-GPL-exception-1.0 +*/ + +#include "tcpclient.h" + +TcpClient::TcpClient(const std::string &connAddr, uint16_t port) +{ +#ifdef _WIN32 + // Initialize Winsock + WSADATA wsaData; + int iResult = 0; + iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (iResult != NO_ERROR) { + wprintf(L"Error at WSAStartup()\n"); + exit(EXIT_FAILURE); + } + const int inetSuccess = inet_pton(AF_INET, connAddr.c_str(), &m_server.sin_addr.s_addr); +#else + const int inetSuccess = inet_aton(connAddr.c_str(), &m_server.sin_addr); +#endif + if (!inetSuccess) { + // Try to resolve hostname + struct hostent *host; + struct in_addr **addrList; + if ( (host = gethostbyname(connAddr.c_str()) ) == nullptr){ + std::cout << "Failed to resolve hostname\n"; + exit(EXIT_FAILURE); + } + addrList = (struct in_addr **) host->h_addr_list; + m_server.sin_addr = *addrList[0]; + } + m_server.sin_port = htons(port); +} + +int TcpClient::sendAndReceive(const std::string &message, std::string &reply) +{ + m_server.sin_family = AF_INET; + m_socketFD = (socket(AF_INET , SOCK_STREAM, 0)); + if (m_socketFD < 0) { + doCloseSocket(); + return e_tcp_fail_socket; + } + + // Connect to daemon + int connectR = connect(m_socketFD, (struct sockaddr *)&m_server, sizeof(m_server)); + if (connectR == -1) { + doCloseSocket(); + return e_tcp_error_conn; + } + const size_t bytesSent = send(m_socketFD, message.c_str(), (int)message.length(), 0); + + if (bytesSent < 0 ) { // send failed + doCloseSocket(); + return e_tcp_error_send; + } + + std::string resp(BUFFER_SIZE, ' '); + size_t bytes_recv; + try { + bytes_recv = recv(m_socketFD, &resp.front(), (int)resp.size(), 0); + } + catch (...) { + std::cout << "Error receiving" << std::endl; + doCloseSocket(); + return e_tcp_error_recv; + } + if (bytes_recv == -1) { + doCloseSocket(); + return e_tcp_error_recv; + } + doCloseSocket(); + reply = resp.substr(0, bytes_recv); // Had to cut it like this for windows + return e_tcp_success; +} |