mirror of
https://github.com/LX3JL/xlxd.git
synced 2026-04-08 16:03:44 +00:00
apply IPv6 diff for xlxd 2.4.x (conflict not resolved)
This commit is contained in:
parent
98db06c331
commit
64070407b0
16 changed files with 331 additions and 134 deletions
101
src/cip.cpp
101
src/cip.cpp
|
|
@ -31,46 +31,66 @@
|
|||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// constructors
|
||||
|
||||
CIp::CIp()
|
||||
CIp::CIp(const int af)
|
||||
{
|
||||
::memset(&m_Addr, 0, sizeof(m_Addr));
|
||||
m_Addr.sin_family = AF_INET;
|
||||
::memset(&m_Addr, 0, m_AddrLen = sizeof(struct sockaddr_in));
|
||||
m_Addr.ss_family = af;
|
||||
}
|
||||
|
||||
CIp::CIp(const char *sz)
|
||||
{
|
||||
::memset(&m_Addr, 0, sizeof(m_Addr));
|
||||
m_Addr.sin_family = AF_INET;
|
||||
// try xxx.xxx.xxx.xxxx first
|
||||
m_Addr.sin_addr.s_addr = inet_addr(sz);
|
||||
if ( m_Addr.sin_addr.s_addr == INADDR_NONE )
|
||||
struct addrinfo hints, *res;
|
||||
|
||||
::memset(&m_Addr, 0, m_AddrLen = sizeof(struct sockaddr_in));
|
||||
m_Addr.ss_family = AF_INET;
|
||||
|
||||
::memset(&hints, 0, sizeof(hints));
|
||||
if ( getaddrinfo(sz, NULL, &hints, &res) == 0 )
|
||||
{
|
||||
// otherwise try to resolve via dns
|
||||
hostent *record = gethostbyname(sz);
|
||||
if( record != NULL )
|
||||
{
|
||||
m_Addr.sin_addr.s_addr = ((in_addr * )record->h_addr)->s_addr;
|
||||
}
|
||||
::memcpy(&m_Addr, res->ai_addr, m_AddrLen = res->ai_addrlen);
|
||||
freeaddrinfo(res);
|
||||
}
|
||||
}
|
||||
|
||||
CIp::CIp(const struct sockaddr_in *sa)
|
||||
CIp::CIp(const struct sockaddr_storage *ss, socklen_t len)
|
||||
{
|
||||
::memcpy(&m_Addr, sa, sizeof(m_Addr));
|
||||
len = ( len < sizeof(m_Addr) ) ? len : sizeof(m_Addr);
|
||||
::memcpy(&m_Addr, ss, m_AddrLen = len);
|
||||
}
|
||||
|
||||
|
||||
CIp::CIp(const CIp &ip)
|
||||
{
|
||||
::memcpy(&m_Addr, &ip.m_Addr, sizeof(m_Addr));
|
||||
::memcpy(&m_Addr, &ip.m_Addr, m_AddrLen = ip.m_AddrLen);
|
||||
}
|
||||
|
||||
CIp::CIp(const CIp &ip, uint16 port)
|
||||
{
|
||||
::memcpy(&m_Addr, &ip.m_Addr, m_AddrLen = ip.m_AddrLen);
|
||||
|
||||
switch (m_Addr.ss_family)
|
||||
{
|
||||
case AF_INET:
|
||||
((struct sockaddr_in *)&m_Addr)->sin_port = htons(port);
|
||||
break;
|
||||
case AF_INET6:
|
||||
((struct sockaddr_in6 *)&m_Addr)->sin6_port = htons(port);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// set
|
||||
// sockaddr
|
||||
|
||||
void CIp::SetSockAddr(struct sockaddr_in *sa)
|
||||
void CIp::SetSockAddr(struct sockaddr_storage *ss, socklen_t len)
|
||||
{
|
||||
::memcpy(&m_Addr, sa, sizeof(m_Addr));
|
||||
len = ( len < sizeof(m_Addr) ) ? len : sizeof(m_Addr);
|
||||
::memcpy(&m_Addr, ss, m_AddrLen = len);
|
||||
}
|
||||
|
||||
struct sockaddr_storage *CIp::GetSockAddr(socklen_t &len)
|
||||
{
|
||||
len = m_AddrLen;
|
||||
return &m_Addr;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -78,14 +98,45 @@ void CIp::SetSockAddr(struct sockaddr_in *sa)
|
|||
|
||||
bool CIp::operator ==(const CIp &ip) const
|
||||
{
|
||||
return ( (ip.m_Addr.sin_family == m_Addr.sin_family) &&
|
||||
(ip.m_Addr.sin_addr.s_addr == m_Addr.sin_addr.s_addr) &&
|
||||
(ip.m_Addr.sin_port == m_Addr.sin_port)) ;
|
||||
if ( ip.m_Addr.ss_family != m_Addr.ss_family )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (m_Addr.ss_family)
|
||||
{
|
||||
case AF_INET:
|
||||
struct sockaddr_in *pi4, *pm4;
|
||||
pi4 = (struct sockaddr_in *)&ip.m_Addr;
|
||||
pm4 = (struct sockaddr_in *)&m_Addr;
|
||||
return ( (pi4->sin_addr.s_addr == pm4->sin_addr.s_addr) &&
|
||||
(pi4->sin_port == pm4->sin_port) );
|
||||
case AF_INET6:
|
||||
struct sockaddr_in6 *pi6, *pm6;
|
||||
pi6 = (struct sockaddr_in6 *)&ip.m_Addr;
|
||||
pm6 = (struct sockaddr_in6 *)&m_Addr;
|
||||
return ( IN6_ARE_ADDR_EQUAL(&pi6->sin6_addr, &pm6->sin6_addr) &&
|
||||
(pi6->sin6_port == pm6->sin6_port) );
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
CIp::operator const char *() const
|
||||
{
|
||||
return ::inet_ntoa(m_Addr.sin_addr);
|
||||
switch (m_Addr.ss_family)
|
||||
{
|
||||
case AF_INET:
|
||||
return ::inet_ntop(m_Addr.ss_family,
|
||||
&((struct sockaddr_in *)&m_Addr)->sin_addr.s_addr,
|
||||
m_AddrStr, sizeof(m_AddrStr));
|
||||
case AF_INET6:
|
||||
return ::inet_ntop(m_Addr.ss_family,
|
||||
((struct sockaddr_in6 *)&m_Addr)->sin6_addr.s6_addr,
|
||||
m_AddrStr, sizeof(m_AddrStr));
|
||||
default:
|
||||
return ::strncpy(m_AddrStr, "unknown", sizeof(m_AddrStr));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue