blob: 64cfcd1d049064d227bb9394b68f455814d372f6 [file]
//
// Copyright (c) 2010-2024 Antmicro
//
// This file is licensed under the MIT License.
// Full license text is available in 'licenses/MIT.txt'.
//
#include "socket_channel.h"
SocketCommunicationChannel::SocketCommunicationChannel()
{
ASocket::SettingsFlag dontLog = ASocket::NO_FLAGS;
mainSocket.reset(new CTCPClient(NULL, dontLog));
senderSocket.reset(new CTCPClient(NULL, dontLog));
}
void SocketCommunicationChannel::connect(int receiverPort, int senderPort, const char* address)
{
mainSocket->Connect(address, std::to_string(receiverPort));
senderSocket->Connect(address, std::to_string(senderPort));
handshakeValid();
}
void SocketCommunicationChannel::disconnect()
{
isConnected = false;
}
bool SocketCommunicationChannel::getIsConnected()
{
return isConnected;
}
void SocketCommunicationChannel::handshakeValid()
{
Protocol* received = receive();
if(received->actionId == handshake) {
sendMain(Protocol(handshake, 0, 0));
isConnected = true;
}
}
void SocketCommunicationChannel::log(int logLevel, const char* data)
{
sendSender(Protocol(logMessage, strlen(data), logLevel));
senderSocket->Send(data, strlen(data));
}
Protocol* SocketCommunicationChannel::receive()
{
Protocol* message = new Protocol;
mainSocket->CTCPClient::Receive((char *)message, sizeof(Protocol));
return message;
}
void SocketCommunicationChannel::sendMain(const Protocol message)
{
try {
mainSocket->Send((char *)&message, sizeof(struct Protocol));
}
catch(const char* msg) {
isConnected = false;
throw msg;
}
}
void SocketCommunicationChannel::sendSender(const Protocol message)
{
try {
senderSocket->Send((char *)&message, sizeof(struct Protocol));
}
catch(const char* msg) {
isConnected = false;
throw msg;
}
}