64 lines
1.6 KiB
C++
64 lines
1.6 KiB
C++
/***
|
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
|
|
|
File: IPAddress.cpp
|
|
Date: 2022-2-1
|
|
Author: Reece
|
|
***/
|
|
#include <Source/RuntimeInternal.hpp>
|
|
#include "Net.hpp"
|
|
#include "IPAddress.hpp"
|
|
|
|
namespace Aurora::IO::Net
|
|
{
|
|
IPAddress::IPAddress()
|
|
{
|
|
this->ip = EIPProtocol::eEnumInvalid;
|
|
}
|
|
|
|
IPAddress::IPAddress(const AuString &parse)
|
|
{
|
|
unsigned char buf[64];
|
|
static_assert(AuArraySize(buf) >= sizeof(struct in6_addr));
|
|
static_assert(AuArraySize(buf) >= sizeof(struct in_addr));
|
|
|
|
this->ip = EIPProtocol::eEnumInvalid;
|
|
|
|
bool isIPV4 {};
|
|
if (parse.size() > 4)
|
|
{
|
|
isIPV4 = parse[1] == '.' || parse[2] == '.';
|
|
}
|
|
|
|
if (inet_pton(isIPV4 ? AF_INET : AF_INET6, parse.c_str(), buf) != 1)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (isIPV4)
|
|
{
|
|
AuWriteU32BE(this->v4, 0, AuReadU32LE(buf, 0));
|
|
}
|
|
else
|
|
{
|
|
auto ipv6 = reinterpret_cast<AuUInt16 *>(buf);
|
|
AuWriteU16BE(&this->v6[0], 0, ipv6[0]);
|
|
AuWriteU16BE(&this->v6[1], 0, ipv6[1]);
|
|
AuWriteU16BE(&this->v6[2], 0, ipv6[2]);
|
|
AuWriteU16BE(&this->v6[3], 0, ipv6[3]);
|
|
AuWriteU16BE(&this->v6[4], 0, ipv6[4]);
|
|
AuWriteU16BE(&this->v6[5], 0, ipv6[5]);
|
|
AuWriteU16BE(&this->v6[6], 0, ipv6[6]);
|
|
}
|
|
}
|
|
|
|
AuString IPAddress::ToString() const
|
|
{
|
|
return {};
|
|
}
|
|
|
|
bool IPAddress::IsValid() const
|
|
{
|
|
return EIPProtocolIsValid(this->ip);
|
|
}
|
|
} |