set INADDR_ANY/IN6ADDR_ANY_INIT address string to m_socket

when CUDPSocket::open() is called with m_address (in CUDPSocket) is nothing,
IPv4 socket is created by "0.0.0.0" (INADDR_ANY) address.

This causes a problem that DMRGateway cannot connect to reflector on IPv6.
To choose default INADDR_ANY/IN6ADDR_ANY_INIT address, added
open(address_family) in UDPSocket.cpp.

Following code sets address string at construction, not modified.
	NXDNNetwork.cpp
	POCSAGNetwork.cpp
	YSFNetwork.cpp

Other codes does not set, modified open() -> open(address_family)
	DMRNetwork.cpp
	DStarNetwork.cpp
	MMDVMHost.cpp
	MobileGPS.cpp
	P25Network.cpp
	RemoteCommand.cpp
	RemoteControl.cpp

I think there is more clever method, but I have no other idea.

Maybe IPv6 support for digital radio works, but RemoteControl can work
IPv4 only.
This commit is contained in:
SASANO Takayoshi
2020-03-29 15:06:20 +09:00
parent c92039d83b
commit dad47317e6
9 changed files with 38 additions and 14 deletions

View File

@@ -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;