← Back to file list Raw

src/U_Networking.cpp

#include "U_Networking.h"
unsigned short Networking::HostPortsBegin = 10230;
unsigned short Networking::HostPortsEnd = 10234;
unsigned short Networking::ClientPortsBegin = 10235;
unsigned short Networking::ClientPortsEnd = 10240;
unsigned short Networking::HostPort = Networking::HostPortsBegin;
unsigned short Networking::ClientPort = Networking::ClientPortsBegin;
int Networking::ParsePort(const std::string& port_str)
{
int port = std::stoi(port_str);
if (port < 1 || port > 65535)
{
return Networking::HostPort; //means invalid (default)
}
return port;
}
bool Networking::ParseEndpoint(boost::asio::ip::udp::endpoint& endpoint, boost::asio::io_context& io_context, const std::string& input, int default_port)
{
std::string ip_part;
std::string port_part;
std::string::size_type delim_pos;
if (input.front() == '[')
{
delim_pos = input.find(']');
if (delim_pos == std::string::npos)
{
return false;
}
ip_part = input.substr(1, delim_pos - 1);
if (input.length() > delim_pos + 2 && input[delim_pos + 1] == ':')
{
port_part = input.substr(delim_pos + 2);
}
}
else
{
delim_pos = input.find_first_of(": ");
if (delim_pos != std::string::npos)
{
ip_part = input.substr(0, delim_pos);
port_part = input.substr(delim_pos + 1);
}
else
{
ip_part = input;
}
}
int port = default_port;
if (!port_part.empty())
{
port = Networking::ParsePort(port_part);
}
boost::system::error_code ec;
boost::asio::ip::address ip_address = boost::asio::ip::make_address(ip_part, ec);
if (!ec)
{
endpoint = boost::asio::ip::udp::endpoint(ip_address, port);
}
else
{
boost::asio::ip::udp::resolver resolver(io_context);
boost::system::error_code err;
auto endpoints = resolver.resolve(ip_part, std::to_string(port), err);
if (err.value() != 0)
{
return false;
}
endpoint = (*endpoints.begin()).endpoint();
}
return true;
}