diff --git a/components/spit/include/I_SAD_Client.hpp b/components/spit/include/I_SAD_Client.hpp deleted file mode 100644 index 1384906..0000000 --- a/components/spit/include/I_SAD_Client.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include -using namespace std; - -class SAD_DetectedServer; -class I_SAD_Client { - public: - /** - * If a new server was found by the ServerAutoDetect mechanism, this function is called.
- * To do so the SAD_Client ServerAutoDetect has to be startet - see SAD_Client::startServerAutoDetect.
- * If a server can be reached via several IP addresses, the IP address is selected according to the following preference:
- * 1.) If a loopback address is available, it is used.
- * 2.) If an IP4 address is available, it is used.
- * 3.) In the other cases the IP6 address is used.
- * @param p_ID the id of the server (every started server should generate an id) - * @param p_Name the name of the SPIT server - * @param p_ComputerName the Hostname of the cpmputer on which the SPIT server is running - * @param p_IP the selected ip address of the SPIT server - * @param p_Port the port of the SPIT server - * @param p_Addition sometimes server may have additional informations - * @param p_IsIP4 the server ip is a ip4 address - */ - virtual void eventServerDetected(SAD_DetectedServer &server) = 0; - /** - * If a SPITServer is not more found, this function is called. - * To do so the SAD_Client ServerAutoDetect has to be startet - see SAD_Client::startServerAutoDetect.
- * @param p_ID the id of the server (every started server should generate an id) - * @param p_Name the name of the SPIT server - * @param p_ComputerName the Hostname of the cpmputer on which the SPIT server is running - * @param p_IP the selected ip address of the SPIT server - * @param p_Port the port of the SPIT server - * @param p_Addition sometimes server may have additional informations - * @param p_IsIP4 the server ip is a ip4 address - */ - virtual void eventServerChanged(SAD_DetectedServer &server) = 0; - - virtual void eventServerLost(SAD_DetectedServer &server) = 0; -}; diff --git a/components/spit/include/SAD_DetectedServer.hpp b/components/spit/include/SAD_DetectedServer.hpp index e0cb50a..fcfc001 100644 --- a/components/spit/include/SAD_DetectedServer.hpp +++ b/components/spit/include/SAD_DetectedServer.hpp @@ -1,36 +1,41 @@ #pragma once -#include "I_SAD_Client.hpp" #include #include #include using namespace std; -class SAD_DetectedServer { - +class SAD_DetectedServer; +class I_SAD_Client { public: - SAD_DetectedServer(); - SAD_DetectedServer(const SAD_DetectedServer &orig) { - m_ID = orig.getID(); - m_Name = orig.getName(); - m_ComputerName = orig.getComputerName(); - m_IP = orig.getIP(); - m_ClientIP = orig.getClientIP(); - m_Port = orig.getPort(); - m_Additions = orig.getAdditions(); + virtual void eventServerDetected(SAD_DetectedServer &server) = 0; + virtual void eventServerChanged(SAD_DetectedServer &server) = 0; + virtual void eventServerLost(SAD_DetectedServer &server) = 0; +}; + +class SAD_DetectedServer { + public: + SAD_DetectedServer() {} + SAD_DetectedServer(const SAD_DetectedServer &orig) + : m_ID(orig.m_ID), + m_Name(orig.m_Name), + m_ComputerName(orig.m_ComputerName), + m_IP(orig.m_IP), + m_ClientIP(orig.m_ClientIP), + m_Port(orig.m_Port), + m_Additions(orig.m_Additions) { } - ~SAD_DetectedServer(); private: - string m_ID; - string m_Name; - string m_ComputerName; - string m_IP; - string m_ClientIP; - string m_Port; - string m_Additions; - string m_ServerProjectName; + string m_ID{}; + string m_Name{}; + string m_ComputerName{}; + string m_IP{}; + string m_ClientIP{}; + string m_Port{}; + string m_Additions{}; + string m_ServerProjectName{}; bool m_New; bool m_Changed; bool m_FoundAgain; @@ -46,14 +51,14 @@ class SAD_DetectedServer { string getProjectName() const { return m_ServerProjectName; } private: - void setID(string p_ID) { m_ID = p_ID; } - void setName(string p_Name) { m_Name = p_Name; } - void setComputerName(string p_ComputerName) { m_ComputerName = p_ComputerName; } - void setIP(string p_IP) { m_IP = p_IP; } - void setClientIP(string p_IP) { m_ClientIP = p_IP; } - void setPort(string p_Port) { m_Port = p_Port; } - void setAdditions(string p_Additions) { m_Additions = p_Additions; } - void setProjectName(string p_ServerProjectName); + void setID(const string& p_ID) { m_ID = p_ID; } + void setName(const string& p_Name) { m_Name = p_Name; } + void setComputerName(const string& p_ComputerName) { m_ComputerName = p_ComputerName; } + void setIP(const string& p_IP) { m_IP = p_IP; } + void setClientIP(const string& p_IP) { m_ClientIP = p_IP; } + void setPort(const string& p_Port) { m_Port = p_Port; } + void setAdditions(const string& p_Additions) { m_Additions = p_Additions; } + void setProjectName(const string& projName); bool getNew() const { return m_New; } bool getChanged() const { return m_Changed; } @@ -63,7 +68,7 @@ class SAD_DetectedServer { void setFoundAgain() { m_FoundAgain = true; } // SAD_Client m_ThreadSend will send to Multicast addresses - void startCycleSAD() { + void resetFlags() { m_Changed = false; m_FoundAgain = false; m_New = false; @@ -83,21 +88,8 @@ class SAD_DetectedServer { static const int PARAMINDEX_ADDITIONS = 7; static const int PARAMINDEX_SERVERPROJECTNAME = 8; static const int PARAMINDEX_IP = 9; - /** - * Used by SAD_Client to add a found SPITServer - don't use this manually - * @param p_IsIP4 true = the server is reached via a IP4 address
false = the server is reahed via a IP6 address - * @param p_ServerID the id of the server, every instance of a SPITServer has an own id - * @param p_ServerParams the server's parameter - */ - static void addDetectedServer(string p_ServerID, string p_ServerParams[]); - /** - * Used by SAD_Client to remove a SPITServer - don't use this manually - * @param p_DetectedServer - */ + static void addDetectedServer(string &id, string p_ServerParams[]); static void removeDetectedServer(SAD_DetectedServer &server); - /** - * Used by SAD_Client to clear all found SPITServers - don't use this manually - */ static void clearDetectedServers(); /** * Used by SAD_Client internally - don't use this manually @@ -115,5 +107,5 @@ class SAD_DetectedServer { * @param p_ServerID the id of the SPITServer * @return the reference of the SAD_DetectedServer instance with getID() == p_ServerID */ - static const SAD_DetectedServer &getRefDetectedServer(string p_ServerID); + static const SAD_DetectedServer &getRefDetectedServer(const string &id); }; diff --git a/components/spit/include/SPITSocket.h b/components/spit/include/SPITSocket.h index 189ddda..da8016e 100644 --- a/components/spit/include/SPITSocket.h +++ b/components/spit/include/SPITSocket.h @@ -85,7 +85,6 @@ class SPITSocket { m_ClientIP = ""; m_ClientPort = ""; m_BoundClientPort = ""; - m_BoundClientFamily = 0; m_IsBound = false; createSocket_UDP(); } @@ -107,60 +106,52 @@ class SPITSocket { 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; 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) { - m_ServerIP = p_ServerIP; - m_ServerPort = p_ServerPort; - m_ClientIP = p_ClientIP; - m_ClientPort = p_ClientPort; + // Sets the ip address and port for server and client. + void setConnectionParams(const string &serverIp, const string &serverPort, const string &clientIp, const string &clientPort) { + m_ServerIP = serverIp; + m_ServerPort = serverPort; + m_ClientIP = clientIp; + m_ClientPort = 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 + * @param message byte buffer containing the message + * @param length length of the message * @return */ - int sendMessage(const char *p_MessageBytes, int p_MessageLength) { + int sendMessage(const char *message, int length) { if (m_ServerPort.length() <= 0) return -1; int intResult; { if (m_IsBound == false) return -1; - intResult = sendMessageTo(m_BoundClientFamily, m_ServerIP, m_ServerPort, p_MessageBytes, p_MessageLength); + intResult = sendMessageTo(m_ServerIP, m_ServerPort, message, length); } return intResult; } - int receiveMessage(int p_InetFamily, char *p_Buffer, int p_BufferLength, string *p_ServerIP); - int setBroadcast(bool p_Broadcast); - int bindSocket(string p_ServerIP, string p_ClientIP, string p_ClientPort); + int receiveMessage(char *p_Buffer, int p_BufferLength, string *serverIp) const; + int setBroadcast(bool p_Broadcast) const; + int bindSocket(string clientIp, string clientPort); - // * Internal usage - don't use this manually - // * Use sendMessage instead - int sendMessageTo(int p_InetFamily, string p_ServerIP, string p_Port, const char *p_MessageBytes, int p_MessageLength); + int sendMessageTo(const string& ip, const string&port, const char *message, int msgLength); - string getServerIP() { return m_ServerIP; } - string getServerPort() { return m_ServerPort; } - string getClientIP() { return m_ClientIP; } - string getClientPort() { return m_ClientPort; } - string getBoundClientPort() { return m_BoundClientPort; } - void setBoundClientPort(string p_Port) { m_BoundClientPort = p_Port; } - void setBoundClientFamily(int p_Family) { m_BoundClientFamily = p_Family; } - int getBoundClientFamily() { return m_BoundClientFamily; } + string getServerIP() const { return m_ServerIP; } + string getServerPort() const { return m_ServerPort; } + string getClientIP() const { return m_ClientIP; } + string getClientPort() const { return m_ClientPort; } + string getBoundClientPort() const { return m_BoundClientPort; } + void setBoundClientPort(const string &p_Port) { m_BoundClientPort = p_Port; } void setIsBound(bool p_IsBound) { m_IsBound = p_IsBound; } - bool getIsBound() { return m_IsBound; } + bool getIsBound() const { return m_IsBound; } + + private: + }; #endif /* SPITSOCKET_H */ diff --git a/components/spit/src/SAD_DetectedServer.cpp b/components/spit/src/SAD_DetectedServer.cpp index e50825f..80b9697 100644 --- a/components/spit/src/SAD_DetectedServer.cpp +++ b/components/spit/src/SAD_DetectedServer.cpp @@ -19,32 +19,19 @@ static const char *TAG = "SpitSrv"; unordered_map SAD_DetectedServer::s_DetectedServers; -SAD_DetectedServer::~SAD_DetectedServer() { -} -//----- Detected Server ----- -SAD_DetectedServer::SAD_DetectedServer() { - m_ID = ""; - m_Name = ""; - m_ComputerName = ""; - m_ClientIP = ""; - m_Port = ""; - m_Additions = ""; -} - -void SAD_DetectedServer::setProjectName(string p_ServerProjectName) { - if (m_ServerProjectName.compare(p_ServerProjectName) != 0) { - if (m_New == false) { - m_Changed = true; - } +void SAD_DetectedServer::setProjectName(const string& projName) { + if ((m_ServerProjectName.compare(projName) != 0) && (m_New == false)) { + m_Changed = true; } - m_ServerProjectName = p_ServerProjectName; + m_ServerProjectName = projName; } void SAD_DetectedServer::cycleStart() { for (auto i = s_DetectedServers.begin(); i != s_DetectedServers.end(); i++) { - i->second->startCycleSAD(); + i->second->resetFlags(); } } + void SAD_DetectedServer::cycleEnd(I_SAD_Client &sadClient) { for (auto &srv : s_DetectedServers) { SAD_DetectedServer *ptrDetectedServer = srv.second; @@ -62,33 +49,31 @@ void SAD_DetectedServer::cycleEnd(I_SAD_Client &sadClient) { /** * Used by SAD_Client to add a found SPITServer - don't use this manually - * @param p_IsIP4 true = the server is reached via a IP4 address
false = the server is reahed via a IP6 address - * @param p_ServerID the id of the server, every instance of a SPITServer has an own id + * @param id the id of the server, every instance of a SPITServer has an own id * @param p_ServerParams the server's parameter */ -void SAD_DetectedServer::addDetectedServer(string p_ServerID, string p_ServerParams[]) { - SAD_DetectedServer *ptrDetectedServer; +void SAD_DetectedServer::addDetectedServer(string &id, string p_ServerParams[]) { + SAD_DetectedServer *detectedServer; { - auto i = s_DetectedServers.find(p_ServerID); + auto i = s_DetectedServers.find(id); if (i != s_DetectedServers.end()) { - ptrDetectedServer = i->second; + detectedServer = i->second; + detectedServer->setFoundAgain(); } else { - ptrDetectedServer = new SAD_DetectedServer(); - ptrDetectedServer->setID(p_ServerParams[PARAMINDEX_ID]); - ptrDetectedServer->setNew(true); + detectedServer = new SAD_DetectedServer(); + detectedServer->setID(p_ServerParams[PARAMINDEX_ID]); + detectedServer->setNew(true); } - ptrDetectedServer->setFoundAgain(); - // second prefer IP4 - ptrDetectedServer->setIP(p_ServerParams[PARAMINDEX_IP]); - ptrDetectedServer->setClientIP(p_ServerParams[PARAMINDEX_CLIENTIP]); - ptrDetectedServer->setName(p_ServerParams[PARAMINDEX_NAME]); - ptrDetectedServer->setComputerName(p_ServerParams[PARAMINDEX_COMPUTERNAME]); - ptrDetectedServer->setPort(p_ServerParams[PARAMINDEX_PORT]); - ptrDetectedServer->setAdditions(p_ServerParams[PARAMINDEX_ADDITIONS]); - ptrDetectedServer->setProjectName(p_ServerParams[PARAMINDEX_SERVERPROJECTNAME]); + detectedServer->setIP(p_ServerParams[PARAMINDEX_IP]); + detectedServer->setClientIP(p_ServerParams[PARAMINDEX_CLIENTIP]); + detectedServer->setName(p_ServerParams[PARAMINDEX_NAME]); + detectedServer->setComputerName(p_ServerParams[PARAMINDEX_COMPUTERNAME]); + detectedServer->setPort(p_ServerParams[PARAMINDEX_PORT]); + detectedServer->setAdditions(p_ServerParams[PARAMINDEX_ADDITIONS]); + detectedServer->setProjectName(p_ServerParams[PARAMINDEX_SERVERPROJECTNAME]); - s_DetectedServers[ptrDetectedServer->getID()] = ptrDetectedServer; + s_DetectedServers[detectedServer->getID()] = detectedServer; } } /** @@ -112,22 +97,9 @@ void SAD_DetectedServer::clearDetectedServers() { SAD_DetectedServer *ptrDetectedServer = i->second; i = s_DetectedServers.erase(i); delete ptrDetectedServer; - if (i == s_DetectedServers.end()) { - break; - } } } -const SAD_DetectedServer &SAD_DetectedServer::getRefDetectedServer(string p_ServerID) { - SAD_DetectedServer *ptrDetectedServer = nullptr; - - auto i = s_DetectedServers.find(p_ServerID); - if (i != s_DetectedServers.end()) { - ptrDetectedServer = i->second; - } - if (ptrDetectedServer != NULL) { - return *ptrDetectedServer; - } - - throw new exception(); +const SAD_DetectedServer &SAD_DetectedServer::getRefDetectedServer(const string &id) { + return *s_DetectedServers.at(id); } \ No newline at end of file diff --git a/components/spit/src/SPITSocket.cpp b/components/spit/src/SPITSocket.cpp index b93b695..10cd6b2 100644 --- a/components/spit/src/SPITSocket.cpp +++ b/components/spit/src/SPITSocket.cpp @@ -27,27 +27,25 @@ using namespace std; * @return */ bool SPITSocket::createSocket_UDP() { - bool boolSuccess = true; - int intResult = -1; - int intOptionValue4 = 1; - - // ip4 if (m_UDPSocketIP4 != INVALID_SOCKET) { close(m_UDPSocketIP4); m_UDPSocketIP4 = INVALID_SOCKET; } m_UDPSocketIP4 = socket(AF_INET, SOCK_DGRAM, 0); + int intResult = -1; + bool success = true; if (m_UDPSocketIP4 == INVALID_SOCKET) { - boolSuccess = false; + success = false; } else { + int intOptionValue4 = 1; intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_REUSEADDR, (void *)&intOptionValue4, sizeof(intOptionValue4)); } if (intResult < 0) { - boolSuccess = false; + success = false; } - if (boolSuccess == true) { + if (success == true) { struct timeval tv; tv.tv_sec = 1; // seconds tv.tv_usec = 0; // microseconds (0.0 sec) @@ -64,138 +62,99 @@ bool SPITSocket::createSocket_UDP() { // intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_RCVBUF, (void*)&intBufferSize, sizeof(intBufferSize)); // intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_SNDBUF, (void*)&intBufferSize, sizeof(intBufferSize)); } - return boolSuccess; + return success; } /** * Binds the socket to the client's ip address and port. The socket option SO_REUSEADDR is set to true. - * @param p_ClientIP ip address of the client - * @param p_ClientPort port of the client. + * @param clientIp ip address of the client + * @param clientPort port of the client. * if p_Port == "0" any free port will be used * @return -1 id bind fails, o if bind is ok * */ -int SPITSocket::bindSocket(string p_ServerIP, string p_ClientIP, string p_ClientPort) { - addrinfo *clientAI; - struct sockaddr_in *ptrIP4SocketAddress; - struct sockaddr_in o_IP4SocketAddress; - int intSocklen; +int SPITSocket::bindSocket(string clientIp, string clientPort) { string stringClientPort; - if (p_ClientPort.length() <= 0) + if (clientPort.length() <= 0) stringClientPort = "0"; else - stringClientPort = p_ClientPort; - // int intResult = SOCKET_ERROR; - int intResult = 0; - if (getaddrinfo(p_ClientIP.data(), p_ClientPort.data(), NULL, &clientAI) != 0) { + stringClientPort = clientPort; + addrinfo *clientAI; + if (getaddrinfo(clientIp.data(), clientPort.data(), nullptr, &clientAI) != 0) { return -1; } - switch (clientAI->ai_family) { - case AF_INET: - if (m_UDPSocketIP4 == INVALID_SOCKET) { - break; - } - ptrIP4SocketAddress = reinterpret_cast(clientAI->ai_addr); - intSocklen = sizeof(*ptrIP4SocketAddress); - // copy the ptrIP4SocketAddress, may be not filled correct by getaddrinfo - memset(&o_IP4SocketAddress, 0, intSocklen); - o_IP4SocketAddress.sin_addr = ptrIP4SocketAddress->sin_addr; - o_IP4SocketAddress.sin_family = ptrIP4SocketAddress->sin_family; - // o_IP4SocketAddress.sin_zero = ptrIP4SocketAddress->sin_zero; - o_IP4SocketAddress.sin_port = ptrIP4SocketAddress->sin_port; - intResult = bind(m_UDPSocketIP4, (const sockaddr *)(ptrIP4SocketAddress), (socklen_t)intSocklen); - if (intResult < 0) { - break; - } - setBoundClientFamily(AF_INET); - if (intResult == 0) { - if (getsockname(m_UDPSocketIP4, (sockaddr *)ptrIP4SocketAddress, (socklen_t *)&intSocklen) != -1) { - setBoundClientPort(to_string((int)ptrIP4SocketAddress->sin_port)); - } - } - break; - default: - setBoundClientFamily(0); - intResult = -1; - break; + if (m_UDPSocketIP4 == INVALID_SOCKET) { + return -1; + } + auto *socketAdr = (sockaddr_in *)(clientAI->ai_addr); + int intSocklen = sizeof(*socketAdr); + // copy the socketAdr, may be not filled correct by getaddrinfo + sockaddr_in o_IP4SocketAddress; + memset(&o_IP4SocketAddress, 0, intSocklen); + o_IP4SocketAddress.sin_addr = socketAdr->sin_addr; + o_IP4SocketAddress.sin_family = socketAdr->sin_family; + o_IP4SocketAddress.sin_port = socketAdr->sin_port; + int intResult = bind(m_UDPSocketIP4, (const sockaddr *)(socketAdr), (socklen_t)intSocklen); + if (intResult < 0) { + return intResult; + } + if ((intResult == 0) && + (getsockname(m_UDPSocketIP4, (sockaddr *)socketAdr, (socklen_t *)&intSocklen) != -1)) { + setBoundClientPort(to_string((int)socketAdr->sin_port)); } freeaddrinfo(clientAI); - if (intResult == -1) { - setIsBound(false); - } else { - setIsBound(true); - } + setIsBound(intResult != -1); return intResult; } /** - * Set whether the sockat are brodcast sockets or not. Set the sockopt SO_BROADCAST to 0 or 1 + * Set whether the socket are broadcast sockets or not. Set the sockopt SO_BROADCAST to 0 or 1 * @param p_Broadcast true SO_BROADCAST is set * false = SO_BROADCAST is not set * @return 0 = ok, -1 = error */ -int SPITSocket::setBroadcast(bool p_Broadcast) { - int intResult; - int intOptionValue = 1; - u_char charOptionValue = 0x01; - // IP4 - if (p_Broadcast) { - intOptionValue = 1; - } else { - intOptionValue = 0; - } - intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_BROADCAST, &intOptionValue, sizeof(int)); - // intResult = setsockopt(m_UDPSocketIP4, IPPROTO_IP, IP_MULTICAST_LOOP, (void*)&charOptionValue, sizeof(charOptionValue)); - +int SPITSocket::setBroadcast(bool broadcast) const { + int intOptionValue = broadcast ? 1 : 0; + int intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_BROADCAST, &intOptionValue, sizeof(int)); return intResult; } /** - * - * @param p_InetFamily AF_INET or AF_INET6 - * @param p_ServerIP the ip address of the server - * @param p_ServerPort the port of the server - * @param p_MessageBytes buffer containing the message - * @param p_MessageLength the length of the message + * @param ip the ip address of the server + * @param port the port of the server + * @param msg buffer containing the message + * @param msgLength the length of the message * @return -1 send fails * 0 send is done */ -int SPITSocket::sendMessageTo(int p_InetFamily, string p_ServerIP, string p_ServerPort, const char *p_MessageBytes, int p_MessageLength) { - if (m_UDPSocketIP4 == INVALID_SOCKET) +int SPITSocket::sendMessageTo(const string &ip, const string &port, const char *message, int msgLength) { + if (m_UDPSocketIP4 == INVALID_SOCKET) { return -1; - struct addrinfo *ptrAddressInfo; - struct sockaddr_in *ptrIP4SocketAddress; - struct sockaddr_in o_IP4SocketAddress; - int intSocklen; - int intResult = -1; + } // prepare AddressInfo - if (getaddrinfo(p_ServerIP.data(), p_ServerPort.data(), NULL, &ptrAddressInfo) != 0) { - return -1; - } - switch (ptrAddressInfo->ai_family) { - case AF_INET: - ptrIP4SocketAddress = reinterpret_cast(ptrAddressInfo->ai_addr); - intSocklen = sizeof(*ptrIP4SocketAddress); - if (m_UDPSocketIP4 != INVALID_SOCKET) { - // copy the ptrIP4SocketAddress, may be not filled correct by getaddrinfo - memset(&o_IP4SocketAddress, 0, intSocklen); - o_IP4SocketAddress.sin_addr = ptrIP4SocketAddress->sin_addr; - o_IP4SocketAddress.sin_family = ptrIP4SocketAddress->sin_family; - o_IP4SocketAddress.sin_port = ptrIP4SocketAddress->sin_port; - intResult = sendto(m_UDPSocketIP4, p_MessageBytes, p_MessageLength, 0, (const sockaddr *)&o_IP4SocketAddress, (socklen_t)intSocklen); - if (intResult < 0) { - printf("UnixSocket::sendMessageTo IP4 sendto %s FAILED %s\n", p_ServerIP.data(), strerror(errno)); - printf("UnixSocket::sendMessageTo ret=%d %s / %s / %d\n", intResult, - p_ServerPort.data(), p_MessageBytes, p_MessageLength); - } - freeaddrinfo(ptrAddressInfo); - } - break; - default: - intResult = -1; + int intResult = -1; + addrinfo *ptrAddressInfo; + if (getaddrinfo(ip.data(), port.data(), nullptr, &ptrAddressInfo) != 0) { + return intResult; } + auto *ptrIP4SocketAddress = (sockaddr_in *)(ptrAddressInfo->ai_addr); + int intSocklen = sizeof(*ptrIP4SocketAddress); + if (m_UDPSocketIP4 != INVALID_SOCKET) { + // copy the ptrIP4SocketAddress, may be not filled correct by getaddrinfo + sockaddr_in o_IP4SocketAddress; + memset(&o_IP4SocketAddress, 0, intSocklen); + o_IP4SocketAddress.sin_addr = ptrIP4SocketAddress->sin_addr; + o_IP4SocketAddress.sin_family = ptrIP4SocketAddress->sin_family; + o_IP4SocketAddress.sin_port = ptrIP4SocketAddress->sin_port; + intResult = sendto(m_UDPSocketIP4, message, msgLength, 0, (const sockaddr *)&o_IP4SocketAddress, (socklen_t)intSocklen); + if (intResult < 0) { + ESP_LOGE("SPIT", "sendMessageTo IP4 sendto %s FAILED %s\n", ip.data(), strerror(errno)); + ESP_LOGE("SPIT", "sendMessageTo ret=%d %s / %s / %d\n", intResult, port.data(), message, msgLength); + } + freeaddrinfo(ptrAddressInfo); + } if (intResult < 0) { return -1; } @@ -204,52 +163,39 @@ int SPITSocket::sendMessageTo(int p_InetFamily, string p_ServerIP, string p_Serv /** * 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 */ -int SPITSocket::receiveMessage(int p_InetFamily, char *p_Buffer, int p_BufferLength, string *p_ServerIP) { +int SPITSocket::receiveMessage(char *p_Buffer, int p_BufferLength, string *serverIp) const { int intResult = -1; - // ADDRINFO *AI; - struct sockaddr_in o_IP4SocketAddress; - int intSocklen; - - switch (p_InetFamily) { - case AF_INET: - if (m_UDPSocketIP4 == INVALID_SOCKET) { - break; - } - intSocklen = sizeof(o_IP4SocketAddress); - memset(&o_IP4SocketAddress, 0, intSocklen); - intResult = recvfrom(m_UDPSocketIP4, (void *)p_Buffer, p_BufferLength, 0, (sockaddr *)&o_IP4SocketAddress, (socklen_t *)&intSocklen); - if (intResult >= 0) { - if (p_ServerIP != NULL) { - char bufferIP4[INET_ADDRSTRLEN]; - inet_ntop(AF_INET, &(o_IP4SocketAddress.sin_addr), bufferIP4, intSocklen); - *p_ServerIP = bufferIP4; - } - } - break; + if (m_UDPSocketIP4 == INVALID_SOCKET) { + return intResult; + } + sockaddr_in o_IP4SocketAddress; + int intSocklen = sizeof(o_IP4SocketAddress); + memset(&o_IP4SocketAddress, 0, intSocklen); + intResult = recvfrom(m_UDPSocketIP4, (void *)p_Buffer, p_BufferLength, 0, (sockaddr *)&o_IP4SocketAddress, (socklen_t *)&intSocklen); + if (intResult >= 0 && serverIp != nullptr) { + char bufferIP4[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &(o_IP4SocketAddress.sin_addr), bufferIP4, intSocklen); + *serverIp = bufferIP4; } return intResult; } SPITSocket::IPAddress SPITSocket::getAdaptersInfo() { // iterate over active interfaces, and print out IPs - esp_netif_t *netif = NULL; - while ((netif = esp_netif_next_unsafe(netif)) != NULL) { + esp_netif_t *netif = nullptr; + if ((netif = esp_netif_next_unsafe(netif)) != nullptr) { ESP_LOGI("SPIT", "Connected to %s", esp_netif_get_desc(netif)); esp_netif_ip_info_t ip; ESP_ERROR_CHECK(esp_netif_get_ip_info(netif, &ip)); ESP_LOGI("SPIT", "- IPv4 address: " IPSTR ",", IP2STR(&ip.ip)); ESP_LOGI("SPIT", "- IPv4 netmask: " IPSTR ",", IP2STR(&ip.netmask)); char buffer[64]; - sprintf(buffer, IPSTR, IP2STR(&ip.ip)); string stringIP4 = buffer; sprintf(buffer, IPSTR, IP2STR(&ip.netmask)); @@ -260,29 +206,18 @@ SPITSocket::IPAddress SPITSocket::getAdaptersInfo() { } string createGUID() { - // uuid_t id; - // uuid_generate(id); - // char *guid_string = new char[100]; - // uuid_unparse(id, guid_string); - // string stringGUID = guid_string; - // return stringGUID; - uuid_t uu; - char uu_str[UUID_STR_LEN]; - uuid_generate(uu); + char uu_str[UUID_STR_LEN]; uuid_unparse(uu, uu_str); - string stringGUID = uu_str; - return stringGUID; + return {uu_str}; } -/** The name of the client's host computer*/ + string getClientHostName() { - string stringHostName = ""; const char *hostname; esp_netif_get_hostname(esp_netif_get_default_netif(), &hostname); if (hostname != nullptr) { - stringHostName = hostname; + return {hostname}; } - return stringHostName; - ; + return ""; } diff --git a/components/spit/src/SPIT_Client.cpp b/components/spit/src/SPIT_Client.cpp index c35b439..a300789 100644 --- a/components/spit/src/SPIT_Client.cpp +++ b/components/spit/src/SPIT_Client.cpp @@ -294,7 +294,7 @@ int SPIT_Client::sendSPITMessage(SPIT_Message::OPPart &spitMessageOPPart) { } bool SPIT_Client::startReceiveSPITMessages() { { - if (mSPITSocket->getBoundClientFamily() <= 0) + if (!mSPITSocket->getIsBound()) return false; m_StopReceiveSPITMessages = false; m_ThreadReceive = new fos::TaskT(receiveSPITMessage, *this, "receiveTask", fos::Task::DefaultStackSize * 4); @@ -317,7 +317,7 @@ void SPIT_Client::receiveSPITMessage(SPIT_Client &rM) { if (rM.m_StopReceiveSPITMessages == true) { return; } - intResult = rM.mSPITSocket->receiveMessage(rM.mSPITSocket->getBoundClientFamily(), buffer, MAXSPITMESSAGEBYTECOUNT, NULL); + intResult = rM.mSPITSocket->receiveMessage(buffer, MAXSPITMESSAGEBYTECOUNT, nullptr); if (intResult < 0) { if (rM.m_StopReceiveSPITMessages) { return; @@ -534,7 +534,7 @@ bool SPIT_Client::connect(string p_ServerIP, string p_ServerPort, string p_Clien disconnect(); { mSPITSocket->setConnectionParams(p_ServerIP, p_ServerPort, p_ClientIP, p_ClientPort); - intResult = mSPITSocket->bindSocket(p_ServerIP, p_ClientIP, p_ClientPort); + intResult = mSPITSocket->bindSocket(p_ClientIP, p_ClientPort); if (intResult < 0) { m_StopReceiveSPITMessages = true; return false; @@ -1518,7 +1518,7 @@ void SPIT_Client::processSocketTask(SPIT_Client &instance) { SAD_DetectedServer::cycleStart(); string stringBroadcastIP4 = instance.mSPITSocket->mOwnIp.getBroadcastIP4(); - instance.mSPITSocket->sendMessageTo(SPITSocket::FAMILY_IP4, stringBroadcastIP4, SERVERAUTODETECT_PORT, stringDatagram.data(), intDatagramLength); + instance.mSPITSocket->sendMessageTo(stringBroadcastIP4, SERVERAUTODETECT_PORT, stringDatagram.data(), intDatagramLength); { // wait for 3000 milliseconds or fos::Task::delayMs(3000); @@ -1531,7 +1531,7 @@ void SPIT_Client::processSocketTask(SPIT_Client &instance) { char buffer[512 + 1]; string stringServerIP; - int intReceivedByteCount = instance.mSPITSocket->receiveMessage(SPITSocket::FAMILY_IP4, buffer, 512, &stringServerIP); + int intReceivedByteCount = instance.mSPITSocket->receiveMessage(buffer, 512, &stringServerIP); if (intReceivedByteCount <= 0) { break; }