aboutsummaryrefslogtreecommitdiffstats
path: root/src/tcpclient.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tcpclient.cpp')
-rw-r--r--src/tcpclient.cpp76
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;
+}