/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/*
* SPITSocket is the base class for WindowsSocket, UnixSocket,..
* Used by SPIT_Client and SAD_Client.
* File: SPITSocket.h
* Author: Hagi
*
* Created on 12. April 2019, 15:40
*/
#ifndef SPITSOCKET_H
#define SPITSOCKET_H
#include "_SPITMACROS.h"
#include "Mutex.hpp"
#include
#include
using namespace std;
class SPITSocket{
public:
static int FAMILY_IP4;
static int FAMILY_IP6;
//-------- nested classes --------------
public:
/**
* IPAddress class is used to fetch all available IP addresses of the computer.
* This is for internal usage.
*/
class IPAddress {
public:
IPAddress();
~IPAddress();
private:
string m_IPAddress;
string m_SubnetMask;
bool m_Found;
public:
const string& getIPAddress() {
return m_IPAddress;
}
const string& getSubnetMask() {
return m_SubnetMask;
}
bool getFound() {
return m_Found;
}
void setIPAddress(const string& p_IPAddress);
void setSubnetMask(const string& p_SubnetMask);
void setFound(bool p_Found);
};
private:
static fos::Mutex s_MutexIPAddresses;
public:
static unordered_map s_IPAddresses;
static void addIPAddress(string p_IPAddress, string p_SubnetMask);
static void removeIPAddress(string p_IPAddress);
static int getIPAddressCount();
static IPAddress* getIPAddress(int p_Index);
static void clearIPAddresses();
static void resetFoundIPAddresses();
static void removeNotFoundIPAddresses();
//-------- class --------------
SPITSocket();
virtual ~SPITSocket();
private:
string m_ServerIP;
string m_ServerPort;
string m_ClientIP;
string m_ClientPort; //port given by the user maybe "0"
string m_BoundClientPort; //port set after bind
int m_BoundClientFamily;
bool m_IsBound;
fos::Mutex m_MutexSocket;
public:
/**
* Sets the ip address and port for server and client.
* @param p_ServerIP
* @param p_ServerPort
* @param p_ClientIP
* @param p_ClientPort
*/
void setConnectionParams(string p_ServerIP, string p_ServerPort, string p_ClientIP, string p_ClientPort);
/**
* Send a message to the server as set by setConnectionParams.
* @param p_MessageBytes byte buffer containing the message
* @param p_MessageLength length of the messaeg
* @return
*/
int sendMessage(const char* p_MessageBytes, int p_MessageLength);
/**
* Call this for receiving a message.
* This will block until a message is received or the underlying socket is closed.
* @param p_InetFamily either AF_INET or AF_INET6
* The SPITSocket creates two udp sockets, one for IP4 and one for IP6.
* This parameter decides from which socket should a message recieved.
* @param p_Buffer the buffer containing the received message later.
* @param p_BufferLength the size of the buffer
* @param p_ServerIP a pointer to a string, when a messages is received the string will contain the ip address of the sender/server.
* if p_ServerIP is NULL - no detection of the server will be done.
* @return
*/
virtual int receiveMessage(int p_InetFamily, char* p_Buffer, int p_BufferLength, string* p_ServerIP) = 0;
/**
* Returns the broadcast address of an ip4 address.
* @param p_IPAdress
* @return
*/
virtual string getBroadcastIP4(IPAddress* p_IPAdress) = 0;
/**
* Set whether the sockat are brodcast sockets or not
* @param p_Broadcast true = the sockets are broadcast sockets
* @return 0 = ok, -1 = error
*/
virtual int setBroadcast(bool p_Broadcast) = 0;
/**
* Bind the client's udp socket to an ip address and port.
* @param p_ClientIP the ip address either IP4 or IP6
* @param p_ClientPort the client port number.
* "0" = bind to any free port.
* @return
*/
virtual int bindSocket(string p_ClientIP, string p_ClientPort) = 0;
/**
* Internal usage - don't use this manually.
* Use sendMessage instead.
* @param p_InetFamily
* @param p_ServerIP
* @param p_Port
* @param p_MessageBytes
* @param p_MessageLength
* @return
*/
virtual int sendMessageTo(int p_InetFamily, string p_ServerIP, string p_Port, const char* p_MessageBytes, int p_MessageLength) = 0;
/**
* Internal usage - don't use this manually.
*/
virtual void getAdaptersInfo() = 0;
string getServerIP();
string getServerPort();
string getClientIP();
string getClientPort();
string getBoundClientPort();
void setBoundClientPort(string p_Port);
void setBoundClientFamily(int p_Family);
int getBoundClientFamily();
void setIsBound(bool p_IsBound);
bool getIsBound();
};
#endif /* SPITSOCKET_H */