diff --git a/DMRNetwork.cpp b/DMRNetwork.cpp index ea52096..91ae0a4 100644 --- a/DMRNetwork.cpp +++ b/DMRNetwork.cpp @@ -362,7 +362,7 @@ void CDMRNetwork::clock(unsigned int ms) if (m_status == WAITING_CONNECT) { m_retryTimer.clock(ms); if (m_retryTimer.isRunning() && m_retryTimer.hasExpired()) { - bool ret = m_socket.open(); + bool ret = m_socket.open(m_address.ss_family); if (ret) { ret = writeLogin(); if (!ret) diff --git a/DStarNetwork.cpp b/DStarNetwork.cpp index 295c289..072b7cf 100644 --- a/DStarNetwork.cpp +++ b/DStarNetwork.cpp @@ -68,7 +68,7 @@ bool CDStarNetwork::open() m_pollTimer.start(); - return m_socket.open(); + return m_socket.open(m_address.ss_family); } bool CDStarNetwork::writeHeader(const unsigned char* header, unsigned int length, bool busy) diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 4769895..9f792e5 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -336,7 +336,7 @@ int CMMDVMHost::run() CUDPSocket::lookup(remoteAddress, remotePort, transparentAddress, transparentAddrLen); transparentSocket = new CUDPSocket(localPort); - ret = transparentSocket->open(); + ret = transparentSocket->open(transparentAddress.ss_family); if (!ret) { LogWarning("Could not open the Transparent data socket, disabling"); delete transparentSocket; diff --git a/MobileGPS.cpp b/MobileGPS.cpp index 7cd782e..0cb2c3b 100644 --- a/MobileGPS.cpp +++ b/MobileGPS.cpp @@ -43,7 +43,7 @@ CMobileGPS::~CMobileGPS() bool CMobileGPS::open() { - bool ret = m_socket.open(); + bool ret = m_socket.open(m_address.ss_family); if (!ret) return false; diff --git a/P25Network.cpp b/P25Network.cpp index a326966..ed28fa6 100644 --- a/P25Network.cpp +++ b/P25Network.cpp @@ -110,7 +110,7 @@ bool CP25Network::open() if (CUDPSocket::isnone(m_address)) return false; - return m_socket.open(); + return m_socket.open(m_address.ss_family); } bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, const CP25LowSpeedData& lsd, bool end) diff --git a/RemoteCommand.cpp b/RemoteCommand.cpp index 42a09be..9d7b038 100644 --- a/RemoteCommand.cpp +++ b/RemoteCommand.cpp @@ -61,15 +61,15 @@ CRemoteCommand::~CRemoteCommand() int CRemoteCommand::send(const std::string& command) { - CUDPSocket socket(0U); - - bool ret = socket.open(); - if (!ret) - return 1; - sockaddr_storage address; unsigned int addrlen; - CUDPSocket::lookup("localhost", m_port, address, addrlen); + CUDPSocket::lookup("127.0.0.1", m_port, address, addrlen); + + CUDPSocket socket(0U); + + bool ret = socket.open(address.ss_family); + if (!ret) + return 1; ret = socket.write((unsigned char*)command.c_str(), command.length(), address, addrlen); if (!ret) { diff --git a/RemoteControl.cpp b/RemoteControl.cpp index 0c72f6b..0c29791 100644 --- a/RemoteControl.cpp +++ b/RemoteControl.cpp @@ -43,7 +43,7 @@ CRemoteControl::~CRemoteControl() bool CRemoteControl::open() { - return m_socket.open(); + return m_socket.open(AF_INET); /* XXX IPv4 only */ } REMOTE_COMMAND CRemoteControl::getCommand() diff --git a/UDPSocket.cpp b/UDPSocket.cpp index 9e5e2cf..a2b5991 100644 --- a/UDPSocket.cpp +++ b/UDPSocket.cpp @@ -117,14 +117,37 @@ bool CUDPSocket::isnone(const sockaddr_storage &addr) (in->sin_addr.s_addr == htonl(INADDR_NONE)) ); } +bool CUDPSocket::open(const unsigned int af) +{ + switch (af) { + case AF_INET6: + m_address = "::"; + break; + case AF_INET: + m_address = "0.0.0.0"; + break; + default: + LogWarning("unknown address family - %d", af); + break; + } + + return open(); +} + bool CUDPSocket::open() { int err; sockaddr_storage addr; unsigned int addrlen; + /* m_address should be defined */ + if (m_address.empty()) { + LogError("The local address is undefined"); + return false; + } + /* to determine protocol family, call lookup() first. */ - err = lookup(m_address.empty() ? "0.0.0.0" : m_address.c_str(), m_port, addr, addrlen); + err = lookup(m_address.c_str(), m_port, addr, addrlen); if (err) { LogError("The local address is invalid - %s", m_address.c_str()); return false; diff --git a/UDPSocket.h b/UDPSocket.h index 288273f..b5add46 100644 --- a/UDPSocket.h +++ b/UDPSocket.h @@ -42,6 +42,7 @@ public: ~CUDPSocket(); bool open(); + bool open(const unsigned int af); int read(unsigned char* buffer, unsigned int length, sockaddr_storage& address, unsigned int &address_length); bool write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address, unsigned int address_length);