diff --git a/DMRNetwork.cpp b/DMRNetwork.cpp index b2aedb5..ea52096 100644 --- a/DMRNetwork.cpp +++ b/DMRNetwork.cpp @@ -36,6 +36,7 @@ const unsigned int HOMEBREW_DATA_PACKET_LENGTH = 55U; CDMRNetwork::CDMRNetwork(const std::string& address, unsigned int port, unsigned int local, unsigned int id, const std::string& password, bool duplex, const char* version, bool debug, bool slot1, bool slot2, HW_TYPE hwType) : m_addressStr(address), m_address(), +m_addrlen(), m_port(port), m_id(NULL), m_password(password), @@ -73,7 +74,7 @@ m_beacon(false) assert(id > 1000U); assert(!password.empty()); - m_address = CUDPSocket::lookup(address); + CUDPSocket::lookup(m_addressStr, m_port, m_address, m_addrlen); m_buffer = new unsigned char[BUFFER_LENGTH]; m_salt = new unsigned char[sizeof(uint32_t)]; @@ -124,8 +125,8 @@ bool CDMRNetwork::open() { LogMessage("DMR, Opening DMR Network"); - if (m_address.s_addr == INADDR_NONE) - m_address = CUDPSocket::lookup(m_addressStr); + if (CUDPSocket::isnone(m_address)) + CUDPSocket::lookup(m_addressStr, m_port, m_address, m_addrlen); m_status = WAITING_CONNECT; m_timeoutTimer.stop(); @@ -377,9 +378,9 @@ void CDMRNetwork::clock(unsigned int ms) return; } - in_addr address; - unsigned int port; - int length = m_socket.read(m_buffer, BUFFER_LENGTH, address, port); + sockaddr_storage address; + unsigned int addrlen; + int length = m_socket.read(m_buffer, BUFFER_LENGTH, address, addrlen); if (length < 0) { LogError("DMR, Socket has failed, retrying connection to the master"); close(); @@ -390,7 +391,7 @@ void CDMRNetwork::clock(unsigned int ms) // if (m_debug && length > 0) // CUtils::dump(1U, "Network Received", m_buffer, length); - if (length > 0 && m_address.s_addr == address.s_addr && m_port == port) { + if (length > 0 && CUDPSocket::match(m_address, address)) { if (::memcmp(m_buffer, "DMRD", 4U) == 0) { if (m_enabled) { if (m_debug) @@ -663,7 +664,7 @@ bool CDMRNetwork::write(const unsigned char* data, unsigned int length) // if (m_debug) // CUtils::dump(1U, "Network Transmitted", data, length); - bool ret = m_socket.write(data, length, m_address, m_port); + bool ret = m_socket.write(data, length, m_address, m_addrlen); if (!ret) { LogError("DMR, Socket has failed when writing data to the master, retrying connection"); m_socket.close(); diff --git a/DMRNetwork.h b/DMRNetwork.h index 9d1c52e..96f1074 100644 --- a/DMRNetwork.h +++ b/DMRNetwork.h @@ -60,7 +60,8 @@ public: private: std::string m_addressStr; - in_addr m_address; + sockaddr_storage m_address; + unsigned int m_addrlen; unsigned int m_port; uint8_t* m_id; std::string m_password; diff --git a/DStarNetwork.cpp b/DStarNetwork.cpp index de0af69..295c289 100644 --- a/DStarNetwork.cpp +++ b/DStarNetwork.cpp @@ -33,7 +33,7 @@ const unsigned int BUFFER_LENGTH = 100U; CDStarNetwork::CDStarNetwork(const std::string& gatewayAddress, unsigned int gatewayPort, unsigned int localPort, bool duplex, const char* version, bool debug) : m_socket(localPort), m_address(), -m_port(gatewayPort), +m_addrlen(), m_duplex(duplex), m_version(version), m_debug(debug), @@ -46,7 +46,7 @@ m_pollTimer(1000U, 60U), m_linkStatus(LS_NONE), m_linkReflector(NULL) { - m_address = CUDPSocket::lookup(gatewayAddress); + CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen); m_linkReflector = new unsigned char[DSTAR_LONG_CALLSIGN_LENGTH]; @@ -63,7 +63,7 @@ bool CDStarNetwork::open() { LogMessage("Opening D-Star network connection"); - if (m_address.s_addr == INADDR_NONE) + if (CUDPSocket::isnone(m_address)) return false; m_pollTimer.start(); @@ -100,7 +100,7 @@ bool CDStarNetwork::writeHeader(const unsigned char* header, unsigned int length CUtils::dump(1U, "D-Star Network Header Sent", buffer, 49U); for (unsigned int i = 0U; i < 2U; i++) { - bool ret = m_socket.write(buffer, 49U, m_address, m_port); + bool ret = m_socket.write(buffer, 49U, m_address, m_addrlen); if (!ret) return false; } @@ -143,7 +143,7 @@ bool CDStarNetwork::writeData(const unsigned char* data, unsigned int length, un if (m_debug) CUtils::dump(1U, "D-Star Network Data Sent", buffer, length + 9U); - return m_socket.write(buffer, length + 9U, m_address, m_port); + return m_socket.write(buffer, length + 9U, m_address, m_addrlen); } bool CDStarNetwork::writePoll(const char* text) @@ -167,7 +167,7 @@ bool CDStarNetwork::writePoll(const char* text) // if (m_debug) // CUtils::dump(1U, "D-Star Network Poll Sent", buffer, 6U + length); - return m_socket.write(buffer, 6U + length, m_address, m_port); + return m_socket.write(buffer, 6U + length, m_address, m_addrlen); } void CDStarNetwork::clock(unsigned int ms) @@ -192,18 +192,12 @@ void CDStarNetwork::clock(unsigned int ms) unsigned char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int length = m_socket.read(buffer, BUFFER_LENGTH, address, port); - if (length <= 0) + sockaddr_storage address; + unsigned int addrlen; + int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen); + if (length <= 0 || !CUDPSocket::match(m_address, address)) return; - // Check if the data is for us - if (m_address.s_addr != address.s_addr || m_port != port) { - LogMessage("D-Star packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port); - return; - } - // Invalid packet type? if (::memcmp(buffer, "DSRP", 4U) != 0) return; diff --git a/DStarNetwork.h b/DStarNetwork.h index aeebbbf..6f96880 100644 --- a/DStarNetwork.h +++ b/DStarNetwork.h @@ -51,8 +51,8 @@ public: private: CUDPSocket m_socket; - in_addr m_address; - unsigned int m_port; + sockaddr_storage m_address; + unsigned int m_addrlen; bool m_duplex; const char* m_version; bool m_debug; diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 53f6d1f..4769895 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -316,8 +316,8 @@ int CMMDVMHost::run() return 1; } - in_addr transparentAddress; - unsigned int transparentPort = 0U; + sockaddr_storage transparentAddress; + unsigned int transparentAddrLen; CUDPSocket* transparentSocket = NULL; unsigned int sendFrameType = 0U; @@ -333,8 +333,7 @@ int CMMDVMHost::run() LogInfo(" Local Port: %u", localPort); LogInfo(" Send Frame Type: %u", sendFrameType); - transparentAddress = CUDPSocket::lookup(remoteAddress); - transparentPort = remotePort; + CUDPSocket::lookup(remoteAddress, remotePort, transparentAddress, transparentAddrLen); transparentSocket = new CUDPSocket(localPort); ret = transparentSocket->open(); @@ -793,7 +792,7 @@ int CMMDVMHost::run() len = m_modem->readTransparentData(data); if (transparentSocket != NULL && len > 0U) - transparentSocket->write(data, len, transparentAddress, transparentPort); + transparentSocket->write(data, len, transparentAddress, transparentAddrLen); if (!m_fixedMode) { if (m_modeTimer.isRunning() && m_modeTimer.hasExpired()) @@ -942,9 +941,9 @@ int CMMDVMHost::run() } if (transparentSocket != NULL) { - in_addr address; - unsigned int port = 0U; - len = transparentSocket->read(data, 200U, address, port); + sockaddr_storage address; + unsigned int addrlen; + len = transparentSocket->read(data, 200U, address, addrlen); if (len > 0U) m_modem->writeTransparentData(data, len); } diff --git a/MobileGPS.cpp b/MobileGPS.cpp index 27721bd..7cd782e 100644 --- a/MobileGPS.cpp +++ b/MobileGPS.cpp @@ -26,7 +26,7 @@ CMobileGPS::CMobileGPS(const std::string& address, unsigned int port, CDMRNetwork* network) : m_idTimer(1000U, 60U), m_address(), -m_port(port), +m_addrlen(), m_socket(), m_network(network) { @@ -34,7 +34,7 @@ m_network(network) assert(port > 0U); assert(network != NULL); - m_address = CUDPSocket::lookup(address); + CUDPSocket::lookup(address, port, m_address, m_addrlen); } CMobileGPS::~CMobileGPS() @@ -71,16 +71,16 @@ void CMobileGPS::close() bool CMobileGPS::pollGPS() { - return m_socket.write((unsigned char*)"MMDVMHost", 9U, m_address, m_port); + return m_socket.write((unsigned char*)"MMDVMHost", 9U, m_address, m_addrlen); } void CMobileGPS::sendReport() { // Grab GPS data if it's available unsigned char buffer[200U]; - in_addr address; - unsigned int port; - int ret = m_socket.read(buffer, 200U, address, port); + sockaddr_storage address; + unsigned int addrlen; + int ret = m_socket.read(buffer, 200U, address, addrlen); if (ret <= 0) return; diff --git a/MobileGPS.h b/MobileGPS.h index 8d69572..8384c65 100644 --- a/MobileGPS.h +++ b/MobileGPS.h @@ -51,8 +51,8 @@ public: private: CTimer m_idTimer; - in_addr m_address; - unsigned int m_port; + sockaddr_storage m_address; + unsigned int m_addrlen; CUDPSocket m_socket; CDMRNetwork* m_network; diff --git a/NXDNNetwork.cpp b/NXDNNetwork.cpp index 9e26900..dcf215e 100644 --- a/NXDNNetwork.cpp +++ b/NXDNNetwork.cpp @@ -31,7 +31,7 @@ const unsigned int BUFFER_LENGTH = 200U; CNXDNNetwork::CNXDNNetwork(const std::string& localAddress, unsigned int localPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) : m_socket(localAddress, localPort), m_address(), -m_port(gatewayPort), +m_addrlen(), m_debug(debug), m_enabled(false), m_buffer(1000U, "NXDN Network") @@ -39,7 +39,7 @@ m_buffer(1000U, "NXDN Network") assert(gatewayPort > 0U); assert(!gatewayAddress.empty()); - m_address = CUDPSocket::lookup(gatewayAddress); + CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen); } CNXDNNetwork::~CNXDNNetwork() @@ -50,7 +50,7 @@ bool CNXDNNetwork::open() { LogMessage("Opening NXDN network connection"); - if (m_address.s_addr == INADDR_NONE) + if (CUDPSocket::isnone(m_address)) return false; return m_socket.open(); @@ -100,25 +100,19 @@ bool CNXDNNetwork::write(const unsigned char* data, NXDN_NETWORK_MESSAGE_TYPE ty if (m_debug) CUtils::dump(1U, "NXDN Network Data Sent", buffer, 102U); - return m_socket.write(buffer, 102U, m_address, m_port); + return m_socket.write(buffer, 102U, m_address, m_addrlen); } void CNXDNNetwork::clock(unsigned int ms) { unsigned char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int length = m_socket.read(buffer, BUFFER_LENGTH, address, port); - if (length <= 0) + sockaddr_storage address; + unsigned int addrlen; + int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen); + if (length <= 0 || !CUDPSocket::match(m_address, address)) return; - // Check if the data is for us - if (m_address.s_addr != address.s_addr || port != m_port) { - LogMessage("NXDN packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port); - return; - } - // Invalid packet type? if (::memcmp(buffer, "ICOM", 4U) != 0) return; diff --git a/NXDNNetwork.h b/NXDNNetwork.h index 3a5b784..ec428d9 100644 --- a/NXDNNetwork.h +++ b/NXDNNetwork.h @@ -57,8 +57,8 @@ public: private: CUDPSocket m_socket; - in_addr m_address; - unsigned int m_port; + sockaddr_storage m_address; + unsigned int m_addrlen; bool m_debug; bool m_enabled; CRingBuffer m_buffer; diff --git a/P25Network.cpp b/P25Network.cpp index 14a0fd5..a326966 100644 --- a/P25Network.cpp +++ b/P25Network.cpp @@ -90,13 +90,13 @@ const unsigned int BUFFER_LENGTH = 100U; CP25Network::CP25Network(const std::string& gatewayAddress, unsigned int gatewayPort, unsigned int localPort, bool debug) : m_socket(localPort), m_address(), -m_port(gatewayPort), +m_addrlen(), m_debug(debug), m_enabled(false), m_buffer(1000U, "P25 Network"), m_audio() { - m_address = CUDPSocket::lookup(gatewayAddress); + CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen); } CP25Network::~CP25Network() @@ -107,7 +107,7 @@ bool CP25Network::open() { LogMessage("Opening P25 network connection"); - if (m_address.s_addr == INADDR_NONE) + if (CUDPSocket::isnone(m_address)) return false; return m_socket.open(); @@ -126,7 +126,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 22U); - bool ret = m_socket.write(buffer, 22U, m_address, m_port); + bool ret = m_socket.write(buffer, 22U, m_address, m_addrlen); if (!ret) return false; @@ -137,7 +137,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 14U); - ret = m_socket.write(buffer, 14U, m_address, m_port); + ret = m_socket.write(buffer, 14U, m_address, m_addrlen); if (!ret) return false; @@ -150,7 +150,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -165,7 +165,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -180,7 +180,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -191,7 +191,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -202,7 +202,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -213,7 +213,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -226,7 +226,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 16U); - ret = m_socket.write(buffer, 16U, m_address, m_port); + ret = m_socket.write(buffer, 16U, m_address, m_addrlen); if (!ret) return false; @@ -234,7 +234,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network END Sent", REC80, 17U); - ret = m_socket.write(REC80, 17U, m_address, m_port); + ret = m_socket.write(REC80, 17U, m_address, m_addrlen); if (!ret) return false; } @@ -255,7 +255,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 22U); - bool ret = m_socket.write(buffer, 22U, m_address, m_port); + bool ret = m_socket.write(buffer, 22U, m_address, m_addrlen); if (!ret) return false; @@ -266,7 +266,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 14U); - ret = m_socket.write(buffer, 14U, m_address, m_port); + ret = m_socket.write(buffer, 14U, m_address, m_addrlen); if (!ret) return false; @@ -283,7 +283,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -297,7 +297,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -311,7 +311,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -326,7 +326,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -337,7 +337,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -348,7 +348,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -361,7 +361,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 16U); - ret = m_socket.write(buffer, 16U, m_address, m_port); + ret = m_socket.write(buffer, 16U, m_address, m_addrlen); if (!ret) return false; @@ -369,7 +369,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network END Sent", REC80, 17U); - ret = m_socket.write(REC80, 17U, m_address, m_port); + ret = m_socket.write(REC80, 17U, m_address, m_addrlen); if (!ret) return false; } @@ -381,18 +381,12 @@ void CP25Network::clock(unsigned int ms) { unsigned char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int length = m_socket.read(buffer, BUFFER_LENGTH, address, port); - if (length <= 0) + sockaddr_storage address; + unsigned int addrlen; + int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen); + if (length <= 0 || !CUDPSocket::match(m_address, address)) return; - // Check if the data is for us - if (m_address.s_addr != address.s_addr || m_port != port) { - LogMessage("P25 packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port); - return; - } - if (!m_enabled) return; diff --git a/P25Network.h b/P25Network.h index 054c772..009c994 100644 --- a/P25Network.h +++ b/P25Network.h @@ -49,8 +49,8 @@ public: private: CUDPSocket m_socket; - in_addr m_address; - unsigned int m_port; + sockaddr_storage m_address; + unsigned int m_addrlen; bool m_debug; bool m_enabled; CRingBuffer m_buffer; diff --git a/POCSAGNetwork.cpp b/POCSAGNetwork.cpp index 682fdd1..e6b755a 100644 --- a/POCSAGNetwork.cpp +++ b/POCSAGNetwork.cpp @@ -31,12 +31,12 @@ const unsigned int BUFFER_LENGTH = 200U; CPOCSAGNetwork::CPOCSAGNetwork(const std::string& myAddress, unsigned int myPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) : m_socket(myAddress, myPort), m_address(), -m_port(gatewayPort), +m_addrlen(), m_debug(debug), m_enabled(false), m_buffer(1000U, "POCSAG Network") { - m_address = CUDPSocket::lookup(gatewayAddress); + CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen); } CPOCSAGNetwork::~CPOCSAGNetwork() @@ -47,7 +47,7 @@ bool CPOCSAGNetwork::open() { LogMessage("Opening POCSAG network connection"); - if (m_address.s_addr == INADDR_NONE) + if (CUDPSocket::isnone(m_address)) return false; return m_socket.open(); @@ -57,18 +57,12 @@ void CPOCSAGNetwork::clock(unsigned int ms) { unsigned char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int length = m_socket.read(buffer, BUFFER_LENGTH, address, port); - if (length <= 0) + sockaddr_storage address; + unsigned int addrlen; + int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen); + if (length <= 0 || !CUDPSocket::match(m_address, address)) return; - // Check if the data is for us - if (m_address.s_addr != address.s_addr || m_port != port) { - LogMessage("POCSAG packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port); - return; - } - // Invalid packet type? if (::memcmp(buffer, "POCSAG", 6U) != 0) return; @@ -118,7 +112,7 @@ void CPOCSAGNetwork::enable(bool enabled) unsigned char c = enabled ? 0x00U : 0xFFU; - m_socket.write(&c, 1U, m_address, m_port); + m_socket.write(&c, 1U, m_address, m_addrlen); m_enabled = enabled; } diff --git a/POCSAGNetwork.h b/POCSAGNetwork.h index fe95203..dd3945b 100644 --- a/POCSAGNetwork.h +++ b/POCSAGNetwork.h @@ -46,8 +46,8 @@ public: private: CUDPSocket m_socket; - in_addr m_address; - unsigned int m_port; + sockaddr_storage m_address; + unsigned int m_addrlen; bool m_debug; bool m_enabled; CRingBuffer m_buffer; diff --git a/RemoteCommand.cpp b/RemoteCommand.cpp index bf3fb1e..42a09be 100644 --- a/RemoteCommand.cpp +++ b/RemoteCommand.cpp @@ -67,9 +67,11 @@ int CRemoteCommand::send(const std::string& command) if (!ret) return 1; - in_addr address = CUDPSocket::lookup("localhost"); + sockaddr_storage address; + unsigned int addrlen; + CUDPSocket::lookup("localhost", m_port, address, addrlen); - ret = socket.write((unsigned char*)command.c_str(), command.length(), address, m_port); + ret = socket.write((unsigned char*)command.c_str(), command.length(), address, addrlen); if (!ret) { socket.close(); return 1; diff --git a/RemoteControl.cpp b/RemoteControl.cpp index afa1473..0c72f6b 100644 --- a/RemoteControl.cpp +++ b/RemoteControl.cpp @@ -53,9 +53,9 @@ REMOTE_COMMAND CRemoteControl::getCommand() char command[BUFFER_LENGTH]; char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int ret = m_socket.read((unsigned char*)buffer, BUFFER_LENGTH, address, port); + sockaddr_storage address; + unsigned int addrlen; + int ret = m_socket.read((unsigned char*)buffer, BUFFER_LENGTH, address, addrlen); if (ret > 0) { buffer[ret] = '\0'; diff --git a/YSFNetwork.cpp b/YSFNetwork.cpp index a8effba..ff5cab8 100644 --- a/YSFNetwork.cpp +++ b/YSFNetwork.cpp @@ -31,7 +31,7 @@ const unsigned int BUFFER_LENGTH = 200U; CYSFNetwork::CYSFNetwork(const std::string& myAddress, unsigned int myPort, const std::string& gatewayAddress, unsigned int gatewayPort, const std::string& callsign, bool debug) : m_socket(myAddress, myPort), m_address(), -m_port(gatewayPort), +m_addrlen(), m_callsign(), m_debug(debug), m_enabled(false), @@ -42,7 +42,7 @@ m_tag(NULL) m_callsign = callsign; m_callsign.resize(YSF_CALLSIGN_LENGTH, ' '); - m_address = CUDPSocket::lookup(gatewayAddress); + CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen); m_tag = new unsigned char[YSF_CALLSIGN_LENGTH]; ::memset(m_tag, ' ', YSF_CALLSIGN_LENGTH); @@ -57,7 +57,7 @@ bool CYSFNetwork::open() { LogMessage("Opening YSF network connection"); - if (m_address.s_addr == INADDR_NONE) + if (CUDPSocket::isnone(m_address)) return false; m_pollTimer.start(); @@ -97,7 +97,7 @@ bool CYSFNetwork::write(const unsigned char* src, const unsigned char* dest, con if (m_debug) CUtils::dump(1U, "YSF Network Data Sent", buffer, 155U); - return m_socket.write(buffer, 155U, m_address, m_port); + return m_socket.write(buffer, 155U, m_address, m_addrlen); } bool CYSFNetwork::writePoll() @@ -115,7 +115,7 @@ bool CYSFNetwork::writePoll() if (m_debug) CUtils::dump(1U, "YSF Network Poll Sent", buffer, 14U); - return m_socket.write(buffer, 14U, m_address, m_port); + return m_socket.write(buffer, 14U, m_address, m_addrlen); } void CYSFNetwork::clock(unsigned int ms) @@ -128,18 +128,12 @@ void CYSFNetwork::clock(unsigned int ms) unsigned char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int length = m_socket.read(buffer, BUFFER_LENGTH, address, port); - if (length <= 0) + sockaddr_storage address; + unsigned int addrlen; + int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen); + if (length <= 0 || !CUDPSocket::match(m_address, address)) return; - // Check if the data is for us - if (m_address.s_addr != address.s_addr || m_port != port) { - LogMessage("YSF packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port); - return; - } - // Ignore incoming polls if (::memcmp(buffer, "YSFP", 4U) == 0) return; diff --git a/YSFNetwork.h b/YSFNetwork.h index e9a430f..292364d 100644 --- a/YSFNetwork.h +++ b/YSFNetwork.h @@ -48,8 +48,8 @@ public: private: CUDPSocket m_socket; - in_addr m_address; - unsigned int m_port; + sockaddr_storage m_address; + unsigned int m_addrlen; std::string m_callsign; bool m_debug; bool m_enabled;