From 0237efd88c2361e72355a60f8d031bea1943bb4a Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Wed, 2 Oct 2019 18:18:20 +0900 Subject: [PATCH] rewrite for Linux, that does not have ss_len, sa_len field. --- POCSAGNetwork.cpp | 8 +++++--- POCSAGNetwork.h | 1 + TCPSocket.cpp | 5 +++-- UDPSocket.cpp | 17 ++++++++++------- UDPSocket.h | 6 +++--- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/POCSAGNetwork.cpp b/POCSAGNetwork.cpp index b771a66..b878de0 100644 --- a/POCSAGNetwork.cpp +++ b/POCSAGNetwork.cpp @@ -28,12 +28,13 @@ CPOCSAGNetwork::CPOCSAGNetwork(const std::string& localAddress, unsigned int localPort, const std::string& remoteAddress, unsigned int remotePort, bool debug) : m_socket(localAddress, localPort), m_address(), +m_addrlen(), m_debug(debug) { assert(!remoteAddress.empty()); assert(remotePort > 0U); - CUDPSocket::lookup(remoteAddress, remotePort, m_address); + CUDPSocket::lookup(remoteAddress, remotePort, m_address, m_addrlen); } CPOCSAGNetwork::~CPOCSAGNetwork() @@ -70,7 +71,7 @@ bool CPOCSAGNetwork::write(CPOCSAGMessage* message) if (m_debug) CUtils::dump(1U, "POCSAG Network Data Sent", data, message->m_length + 10U); - return m_socket.write(data, message->m_length + 10U, m_address); + return m_socket.write(data, message->m_length + 10U, m_address, m_addrlen); } unsigned int CPOCSAGNetwork::read(unsigned char* data) @@ -78,7 +79,8 @@ unsigned int CPOCSAGNetwork::read(unsigned char* data) assert(data != NULL); sockaddr_storage address; - int length = m_socket.read(data, 1U, address); + unsigned int addrlen; + int length = m_socket.read(data, 1U, address, addrlen); if (length <= 0) return 0U; diff --git a/POCSAGNetwork.h b/POCSAGNetwork.h index c881253..40e19b1 100644 --- a/POCSAGNetwork.h +++ b/POCSAGNetwork.h @@ -41,6 +41,7 @@ public: private: CUDPSocket m_socket; sockaddr_storage m_address; + unsigned int m_addrlen; bool m_debug; }; diff --git a/TCPSocket.cpp b/TCPSocket.cpp index 1d82a90..873dd70 100644 --- a/TCPSocket.cpp +++ b/TCPSocket.cpp @@ -72,12 +72,13 @@ bool CTCPSocket::open() } struct sockaddr_storage addr; - if (CUDPSocket::lookup(m_address, m_port, addr)) { + unsigned int addrlen; + if (CUDPSocket::lookup(m_address, m_port, addr, addrlen)) { close(); return false; } - if (::connect(m_fd, (sockaddr*)&addr, ((sockaddr*)&addr)->sa_len) == -1) { + if (::connect(m_fd, (sockaddr*)&addr, addrlen) == -1) { #if defined(_WIN32) || defined(_WIN64) LogError("Cannot connect the TCP client socket, err=%d", ::GetLastError()); #else diff --git a/UDPSocket.cpp b/UDPSocket.cpp index 80d59b6..2f55c03 100644 --- a/UDPSocket.cpp +++ b/UDPSocket.cpp @@ -62,7 +62,7 @@ CUDPSocket::~CUDPSocket() #endif } -int CUDPSocket::lookup(const std::string& hostname, unsigned int port, sockaddr_storage &addr) +int CUDPSocket::lookup(const std::string& hostname, unsigned int port, sockaddr_storage &addr, unsigned int &address_length) { int err; std::string portstr = std::to_string(port); @@ -80,6 +80,7 @@ int CUDPSocket::lookup(const std::string& hostname, unsigned int port, sockaddr_ } ::memcpy(&addr, res->ai_addr, res->ai_addrlen); + address_length = res->ai_addrlen; freeaddrinfo(res); return 0; @@ -89,9 +90,10 @@ bool CUDPSocket::open() { int err; sockaddr_storage addr; + unsigned int addrlen; /* to determine protocol family, call lookup() first. */ - err = lookup(m_address.empty() ? "0.0.0.0" : m_address.c_str(), m_port, addr); + err = lookup(m_address.empty() ? "0.0.0.0" : m_address.c_str(), m_port, addr, addrlen); if (err) { LogError("The local address is invalid - %s", m_address.c_str()); return false; @@ -118,7 +120,7 @@ bool CUDPSocket::open() return false; } - if (::bind(m_fd, (sockaddr*)&addr, addr.ss_len) == -1) { + if (::bind(m_fd, (sockaddr*)&addr, addrlen) == -1) { #if defined(_WIN32) || defined(_WIN64) LogError("Cannot bind the UDP address, err: %lu", ::GetLastError()); #else @@ -133,7 +135,7 @@ bool CUDPSocket::open() return true; } -int CUDPSocket::read(unsigned char* buffer, unsigned int length, sockaddr_storage& address) +int CUDPSocket::read(unsigned char* buffer, unsigned int length, sockaddr_storage& address, unsigned int &address_length) { assert(buffer != NULL); assert(length > 0U); @@ -185,18 +187,19 @@ int CUDPSocket::read(unsigned char* buffer, unsigned int length, sockaddr_storag return -1; } + address_length = size; return len; } -bool CUDPSocket::write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address) +bool CUDPSocket::write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address, unsigned int address_length) { assert(buffer != NULL); assert(length > 0U); #if defined(_WIN32) || defined(_WIN64) - int ret = ::sendto(m_fd, (char *)buffer, length, 0, (sockaddr *)&address, ((sockaddr *)&address)->sa_len); + int ret = ::sendto(m_fd, (char *)buffer, length, 0, (sockaddr *)&address, address_length); #else - ssize_t ret = ::sendto(m_fd, (char *)buffer, length, 0, (sockaddr *)&address, ((sockaddr *)&address)->sa_len); + ssize_t ret = ::sendto(m_fd, (char *)buffer, length, 0, (sockaddr *)&address, address_length); #endif if (ret < 0) { #if defined(_WIN32) || defined(_WIN64) diff --git a/UDPSocket.h b/UDPSocket.h index b9c1ecb..729a7a3 100644 --- a/UDPSocket.h +++ b/UDPSocket.h @@ -42,12 +42,12 @@ public: bool open(); - int read(unsigned char* buffer, unsigned int length, sockaddr_storage& address); - bool write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address); + 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); void close(); - static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage &address); + static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage &address, unsigned int &address_length); private: std::string m_address;