Files
stvpn/tcpclient.cpp
T
2026-04-23 12:28:36 +02:00

85 lines
2.4 KiB
C++

extern "C" {
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
}
#include <expected>
#include <string>
#include <vector>
#include <span>
#include <iostream>
#include <tcpclient.hpp>
TCPClient::TCPClient() {
sock = 0;
}
std::expected<void, std::string> TCPClient::conn(const std::string address, const int port) {
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
return std::unexpected("Error opening socket");
}
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);
const char* addr = address.data();
if (inet_pton(AF_INET, addr, &serv_addr.sin_addr) <= 0) {
return std::unexpected("Invalid server IP address");
}
struct timeval timeout;
timeout.tv_sec = 3;
timeout.tv_usec = 0;
if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof timeout) < 0) {
return std::unexpected("Set timeout error");
}
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof timeout) < 0) {
return std::unexpected("Set timeout error");
}
if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
return std::unexpected("Connecting error");
}
return {};
}
std::expected<int, std::string> TCPClient::writeBytes(std::span<const std::byte> payload) {
int n = 0;
if ((n = write(sock, payload.data(), payload.size())) < 0) {
return std::unexpected("Write error");
}
return n;
}
std::expected<int, std::string> TCPClient::writeBytes(std::string payload) {
int n = 0;
if ((n = write(sock, payload.data(), payload.size())) < 0) {
return std::unexpected("Write error");
}
return n;
}
std::expected<int, std::string> TCPClient::readBytes(std::vector<std::byte>* buffer) {
int n = 0;
if ((n = read(sock, buffer->data(), buffer->size())) < 0) {
return std::unexpected("Read error");
}
return n;
}
std::expected<int, std::string> TCPClient::readBytes(std::vector<uint8_t>* buffer) {
return read(sock, buffer->data(), buffer->size());
}