indent with tabs
This commit is contained in:
@@ -16,109 +16,109 @@ namespace network {
|
||||
|
||||
/* Create an invalid address */
|
||||
IPAddress::IPAddress() noexcept
|
||||
: m_Address(0), m_Valid(false) {
|
||||
: m_Address(0), m_Valid(false) {
|
||||
|
||||
}
|
||||
|
||||
/* Initialize by string IP */
|
||||
IPAddress::IPAddress(const std::string& ip)
|
||||
: m_Address(0), m_Valid(false) {
|
||||
: m_Address(0), m_Valid(false) {
|
||||
|
||||
std::sregex_iterator begin(ip.begin(), ip.end(), IPRegex);
|
||||
std::sregex_iterator end;
|
||||
std::sregex_iterator begin(ip.begin(), ip.end(), IPRegex);
|
||||
std::sregex_iterator end;
|
||||
|
||||
if (begin == end) return; // m_Valid = false
|
||||
if (begin == end) return; // m_Valid = false
|
||||
|
||||
std::smatch match = *begin;
|
||||
std::smatch match = *begin;
|
||||
|
||||
std::uint8_t octet1 = std::stoul(std::string(match[1]));
|
||||
std::uint8_t octet2 = std::stoul(std::string(match[2]));
|
||||
std::uint8_t octet3 = std::stoul(std::string(match[3]));
|
||||
std::uint8_t octet4 = std::stoul(std::string(match[4]));
|
||||
std::uint8_t octet1 = std::stoul(std::string(match[1]));
|
||||
std::uint8_t octet2 = std::stoul(std::string(match[2]));
|
||||
std::uint8_t octet3 = std::stoul(std::string(match[3]));
|
||||
std::uint8_t octet4 = std::stoul(std::string(match[4]));
|
||||
|
||||
m_Address = static_cast<std::uint32_t>((octet1 << 24) | (octet2 << 16) | (octet3 << 8) | octet4);
|
||||
m_Valid = true;
|
||||
m_Address = static_cast<std::uint32_t>((octet1 << 24) | (octet2 << 16) | (octet3 << 8) | octet4);
|
||||
m_Valid = true;
|
||||
}
|
||||
|
||||
IPAddress::IPAddress(const std::wstring& ip)
|
||||
: m_Address(0), m_Valid(false) {
|
||||
: m_Address(0), m_Valid(false) {
|
||||
|
||||
std::wsregex_iterator begin(ip.begin(), ip.end(), IPRegexW);
|
||||
std::wsregex_iterator end;
|
||||
std::wsregex_iterator begin(ip.begin(), ip.end(), IPRegexW);
|
||||
std::wsregex_iterator end;
|
||||
|
||||
if (begin == end) return; // m_Valid = false
|
||||
if (begin == end) return; // m_Valid = false
|
||||
|
||||
std::wsmatch match = *begin;
|
||||
std::wsmatch match = *begin;
|
||||
|
||||
std::uint8_t octet1 = std::stoul(match[1]);
|
||||
std::uint8_t octet2 = std::stoul(match[2]);
|
||||
std::uint8_t octet3 = std::stoul(match[3]);
|
||||
std::uint8_t octet4 = std::stoul(match[4]);
|
||||
std::uint8_t octet1 = std::stoul(match[1]);
|
||||
std::uint8_t octet2 = std::stoul(match[2]);
|
||||
std::uint8_t octet3 = std::stoul(match[3]);
|
||||
std::uint8_t octet4 = std::stoul(match[4]);
|
||||
|
||||
m_Address = static_cast<std::uint32_t>((octet1 << 24) | (octet2 << 16) | (octet3 << 8) | octet4);
|
||||
m_Valid = true;
|
||||
m_Address = static_cast<std::uint32_t>((octet1 << 24) | (octet2 << 16) | (octet3 << 8) | octet4);
|
||||
m_Valid = true;
|
||||
}
|
||||
|
||||
/* Initialize by octets */
|
||||
IPAddress::IPAddress(uint8_t octet1, uint8_t octet2, uint8_t octet3, uint8_t octet4) noexcept
|
||||
: m_Valid(true) {
|
||||
m_Address = static_cast<std::uint32_t>((octet1 << 24) | (octet2 << 16) | (octet3 << 8) | octet4);
|
||||
: m_Valid(true) {
|
||||
m_Address = static_cast<std::uint32_t>((octet1 << 24) | (octet2 << 16) | (octet3 << 8) | octet4);
|
||||
}
|
||||
|
||||
/* Get the specific octet */
|
||||
uint8_t IPAddress::GetOctet(uint8_t num) const {
|
||||
if (num == 0 || num > 4) throw std::invalid_argument("Invalid argument in IPAddress:GetOctet.");
|
||||
if (num == 0 || num > 4) throw std::invalid_argument("Invalid argument in IPAddress:GetOctet.");
|
||||
|
||||
return (m_Address >> (8 * (4 - num))) & 0xFF;
|
||||
return (m_Address >> (8 * (4 - num))) & 0xFF;
|
||||
}
|
||||
|
||||
/* Set the specific octet. 1-4 */
|
||||
void IPAddress::SetOctet(uint8_t num, uint8_t value) {
|
||||
if (num == 0 || num > 4) throw std::invalid_argument("Invalid argument in IPAddress:GetOctet.");
|
||||
uint8_t octets[4];
|
||||
if (num == 0 || num > 4) throw std::invalid_argument("Invalid argument in IPAddress:GetOctet.");
|
||||
uint8_t octets[4];
|
||||
|
||||
for (int i = 0; i < 4; ++i)
|
||||
octets[i] = (m_Address >> ((3 - i) * 8)) & 0xFF;
|
||||
for (int i = 0; i < 4; ++i)
|
||||
octets[i] = (m_Address >> ((3 - i) * 8)) & 0xFF;
|
||||
|
||||
octets[num - 1] = value;
|
||||
octets[num - 1] = value;
|
||||
|
||||
m_Address = static_cast<std::uint32_t>((octets[0] << 24) | (octets[1] << 16) | (octets[2] << 8) | octets[3]);
|
||||
m_Address = static_cast<std::uint32_t>((octets[0] << 24) | (octets[1] << 16) | (octets[2] << 8) | octets[3]);
|
||||
}
|
||||
|
||||
IPAddress IPAddress::LocalAddress() {
|
||||
return IPAddress(127, 0, 0, 1);
|
||||
return IPAddress(127, 0, 0, 1);
|
||||
}
|
||||
|
||||
std::string IPAddress::ToString() const {
|
||||
std::stringstream ss;
|
||||
std::stringstream ss;
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
if (i != 0) ss << ".";
|
||||
ss << static_cast<unsigned int>(GetOctet(i + 1));
|
||||
}
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
if (i != 0) ss << ".";
|
||||
ss << static_cast<unsigned int>(GetOctet(i + 1));
|
||||
}
|
||||
|
||||
return ss.str();
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
bool IPAddress::operator==(const IPAddress& right) {
|
||||
return m_Address == right.m_Address;
|
||||
return m_Address == right.m_Address;
|
||||
}
|
||||
|
||||
bool IPAddress::operator!=(const IPAddress& right) {
|
||||
return !(*this == right);
|
||||
return !(*this == right);
|
||||
}
|
||||
|
||||
bool IPAddress::operator==(bool b) {
|
||||
return IsValid() == b;
|
||||
return IsValid() == b;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const IPAddress& addr) {
|
||||
return os << addr.ToString();
|
||||
return os << addr.ToString();
|
||||
}
|
||||
|
||||
std::wostream& operator<<(std::wostream& os, const IPAddress& addr) {
|
||||
std::string str = addr.ToString();
|
||||
return os << std::wstring(str.begin(), str.end());
|
||||
std::string str = addr.ToString();
|
||||
return os << std::wstring(str.begin(), str.end());
|
||||
}
|
||||
|
||||
} // ns network
|
||||
|
||||
@@ -5,20 +5,20 @@ namespace network {
|
||||
|
||||
class NetworkInitializer {
|
||||
public:
|
||||
NetworkInitializer();
|
||||
~NetworkInitializer();
|
||||
NetworkInitializer();
|
||||
~NetworkInitializer();
|
||||
|
||||
NetworkInitializer(const NetworkInitializer& rhs) = delete;
|
||||
NetworkInitializer& operator=(const NetworkInitializer& rhs) = delete;
|
||||
NetworkInitializer(const NetworkInitializer& rhs) = delete;
|
||||
NetworkInitializer& operator=(const NetworkInitializer& rhs) = delete;
|
||||
};
|
||||
|
||||
#ifdef _WIN32
|
||||
NetworkInitializer::NetworkInitializer() {
|
||||
WSADATA wsaData;
|
||||
WSAStartup(MAKEWORD(2, 2), &wsaData);
|
||||
WSADATA wsaData;
|
||||
WSAStartup(MAKEWORD(2, 2), &wsaData);
|
||||
}
|
||||
NetworkInitializer::~NetworkInitializer() {
|
||||
WSACleanup();
|
||||
WSACleanup();
|
||||
}
|
||||
#else
|
||||
NetworkInitializer::NetworkInitializer() {
|
||||
@@ -32,36 +32,36 @@ NetworkInitializer::~NetworkInitializer() {
|
||||
NetworkInitializer initializer;
|
||||
|
||||
IPAddresses Dns::Resolve(const std::string& host) {
|
||||
IPAddresses list;
|
||||
addrinfo hints{};
|
||||
addrinfo* addresses = nullptr;
|
||||
IPAddresses list;
|
||||
addrinfo hints{};
|
||||
addrinfo* addresses = nullptr;
|
||||
|
||||
//hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_family = AF_INET;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_protocol = IPPROTO_TCP;
|
||||
//hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_family = AF_INET;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_protocol = IPPROTO_TCP;
|
||||
|
||||
getaddrinfo(host.c_str(), NULL, &hints, &addresses);
|
||||
getaddrinfo(host.c_str(), NULL, &hints, &addresses);
|
||||
|
||||
for (addrinfo* p = addresses; p != NULL; p = p->ai_next) {
|
||||
for (addrinfo* p = addresses; p != NULL; p = p->ai_next) {
|
||||
#ifdef _WIN32
|
||||
//wchar_t straddr[35];
|
||||
//char straddr[512];
|
||||
//DWORD len;
|
||||
//WSAAddressToStringA(p->ai_addr, p->ai_addrlen, NULL, straddr, &len);
|
||||
//wchar_t straddr[35];
|
||||
//char straddr[512];
|
||||
//DWORD len;
|
||||
//WSAAddressToStringA(p->ai_addr, p->ai_addrlen, NULL, straddr, &len);
|
||||
|
||||
char* straddr = inet_ntoa(((sockaddr_in*)p->ai_addr)->sin_addr);
|
||||
char* straddr = inet_ntoa(((sockaddr_in*)p->ai_addr)->sin_addr);
|
||||
|
||||
#else
|
||||
char straddr[512];
|
||||
char straddr[512];
|
||||
|
||||
inet_ntop(p->ai_family, &(reinterpret_cast<sockaddr_in*>(p->ai_addr))->sin_addr, straddr, sizeof(straddr));
|
||||
inet_ntop(p->ai_family, &(reinterpret_cast<sockaddr_in*>(p->ai_addr))->sin_addr, straddr, sizeof(straddr));
|
||||
#endif
|
||||
|
||||
list.push_back(IPAddress(straddr));
|
||||
}
|
||||
list.push_back(IPAddress(straddr));
|
||||
}
|
||||
|
||||
return list;
|
||||
return list;
|
||||
}
|
||||
|
||||
} // ns network
|
||||
|
||||
@@ -13,68 +13,67 @@ namespace td {
|
||||
namespace network {
|
||||
|
||||
Socket::Socket(Type type)
|
||||
: m_Blocking(false),
|
||||
m_Type(type),
|
||||
m_Status(Disconnected),
|
||||
m_Handle(static_cast<SocketHandle>(INVALID_SOCKET))
|
||||
{
|
||||
: m_Blocking(false),
|
||||
m_Type(type),
|
||||
m_Status(Disconnected),
|
||||
m_Handle(static_cast<SocketHandle>(INVALID_SOCKET)) {
|
||||
|
||||
}
|
||||
|
||||
Socket::~Socket() {
|
||||
Disconnect();
|
||||
Disconnect();
|
||||
}
|
||||
|
||||
bool Socket::SetBlocking(bool block) {
|
||||
unsigned long mode = block ? 0 : 1;
|
||||
unsigned long mode = block ? 0 : 1;
|
||||
|
||||
if (ioctl(m_Handle, FIONBIO, &mode) < 0) {
|
||||
return false;
|
||||
}
|
||||
if (ioctl(m_Handle, FIONBIO, &mode) < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_Blocking = block;
|
||||
m_Blocking = block;
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Socket::IsBlocking() const noexcept {
|
||||
return m_Blocking;
|
||||
return m_Blocking;
|
||||
}
|
||||
|
||||
Socket::Type Socket::GetType() const noexcept {
|
||||
return m_Type;
|
||||
return m_Type;
|
||||
}
|
||||
|
||||
SocketHandle Socket::GetHandle() const noexcept {
|
||||
return m_Handle;
|
||||
return m_Handle;
|
||||
}
|
||||
|
||||
void Socket::SetStatus(Socket::Status status) {
|
||||
m_Status = status;
|
||||
m_Status = status;
|
||||
}
|
||||
|
||||
Socket::Status Socket::GetStatus() const noexcept {
|
||||
return m_Status;
|
||||
return m_Status;
|
||||
}
|
||||
|
||||
bool Socket::Connect(const std::string& ip, uint16_t port) {
|
||||
IPAddress addr(ip);
|
||||
return Connect(addr, port);
|
||||
IPAddress addr(ip);
|
||||
return Connect(addr, port);
|
||||
}
|
||||
|
||||
std::size_t Socket::Send(const std::string& data) {
|
||||
return this->Send(reinterpret_cast<const unsigned char*>(data.c_str()), data.length());
|
||||
return this->Send(reinterpret_cast<const unsigned char*>(data.c_str()), data.length());
|
||||
}
|
||||
|
||||
std::size_t Socket::Send(DataBuffer& buffer) {
|
||||
std::string data = buffer.ToString();
|
||||
return this->Send(reinterpret_cast<const unsigned char*>(data.c_str()), data.length());
|
||||
std::string data = buffer.ToString();
|
||||
return this->Send(reinterpret_cast<const unsigned char*>(data.c_str()), data.length());
|
||||
}
|
||||
|
||||
void Socket::Disconnect() {
|
||||
if (m_Handle < 0)
|
||||
closesocket(m_Handle);
|
||||
m_Status = Disconnected;
|
||||
if (m_Handle < 0)
|
||||
closesocket(m_Handle);
|
||||
m_Status = Disconnected;
|
||||
}
|
||||
|
||||
} // ns network
|
||||
|
||||
@@ -14,58 +14,58 @@ namespace network {
|
||||
TCPListener::TCPListener() {}
|
||||
|
||||
TCPListener::~TCPListener() {
|
||||
Destroy();
|
||||
Destroy();
|
||||
}
|
||||
|
||||
bool TCPListener::Listen(uint16_t port, int maxConnections) {
|
||||
if ((m_Handle = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
|
||||
return false;
|
||||
if ((m_Handle = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
|
||||
return false;
|
||||
|
||||
struct sockaddr_in address;
|
||||
address.sin_family = AF_INET;
|
||||
address.sin_addr.s_addr = INADDR_ANY;
|
||||
address.sin_port = htons(port);
|
||||
struct sockaddr_in address;
|
||||
address.sin_family = AF_INET;
|
||||
address.sin_addr.s_addr = INADDR_ANY;
|
||||
address.sin_port = htons(port);
|
||||
|
||||
if (::bind(m_Handle, reinterpret_cast<sockaddr*>(&address), sizeof(address)) < 0)
|
||||
return false;
|
||||
if (::bind(m_Handle, reinterpret_cast<sockaddr*>(&address), sizeof(address)) < 0)
|
||||
return false;
|
||||
|
||||
if (::listen(m_Handle, maxConnections) < 0)
|
||||
return false;
|
||||
if (::listen(m_Handle, maxConnections) < 0)
|
||||
return false;
|
||||
|
||||
m_Port = port;
|
||||
m_MaxConnections = maxConnections;
|
||||
m_Port = port;
|
||||
m_MaxConnections = maxConnections;
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TCPListener::Accept(TCPSocket& newSocket) {
|
||||
int addrlen = sizeof(newSocket.m_RemoteAddr);
|
||||
if ((newSocket.m_Handle = ::accept(m_Handle, reinterpret_cast<sockaddr*>(&newSocket.m_RemoteAddr),
|
||||
reinterpret_cast<socklen_t*>(&addrlen))) < 0)
|
||||
return false;
|
||||
newSocket.SetStatus(Socket::Status::Connected);
|
||||
newSocket.SetBlocking(false);
|
||||
return true;
|
||||
int addrlen = sizeof(newSocket.m_RemoteAddr);
|
||||
if ((newSocket.m_Handle = ::accept(m_Handle, reinterpret_cast<sockaddr*>(&newSocket.m_RemoteAddr),
|
||||
reinterpret_cast<socklen_t*>(&addrlen))) < 0)
|
||||
return false;
|
||||
newSocket.SetStatus(Socket::Status::Connected);
|
||||
newSocket.SetBlocking(false);
|
||||
return true;
|
||||
}
|
||||
|
||||
void TCPListener::Destroy() {
|
||||
if (m_Handle < 0)
|
||||
::closesocket(m_Handle);
|
||||
if (m_Handle < 0)
|
||||
::closesocket(m_Handle);
|
||||
}
|
||||
|
||||
bool TCPListener::Close() {
|
||||
if (::shutdown(m_Handle, SD_BOTH) == 0)
|
||||
return true;
|
||||
return false;
|
||||
if (::shutdown(m_Handle, SD_BOTH) == 0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool TCPListener::SetBlocking(bool blocking) {
|
||||
unsigned long mode = blocking ? 0 : 1;
|
||||
unsigned long mode = blocking ? 0 : 1;
|
||||
|
||||
if (::ioctlsocket(m_Handle, FIONBIO, &mode) < 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
if (::ioctlsocket(m_Handle, FIONBIO, &mode) < 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} // namespace network
|
||||
} // namespace td
|
||||
@@ -14,132 +14,132 @@ namespace td {
|
||||
namespace network {
|
||||
|
||||
TCPSocket::TCPSocket() : Socket(Socket::TCP), m_Port(0) {
|
||||
m_Handle = static_cast<SocketHandle>(INVALID_SOCKET);
|
||||
m_Handle = static_cast<SocketHandle>(INVALID_SOCKET);
|
||||
}
|
||||
|
||||
bool TCPSocket::Connect(const IPAddress& address, unsigned short port) {
|
||||
if (this->GetStatus() == Connected)
|
||||
return true;
|
||||
if (this->GetStatus() == Connected)
|
||||
return true;
|
||||
|
||||
struct addrinfo hints {};
|
||||
memset(&hints, 0, sizeof(addrinfo));
|
||||
struct addrinfo hints {};
|
||||
memset(&hints, 0, sizeof(addrinfo));
|
||||
|
||||
struct addrinfo* result = nullptr;
|
||||
struct addrinfo* result = nullptr;
|
||||
|
||||
hints.ai_family = AF_INET;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_protocol = IPPROTO_TCP;
|
||||
hints.ai_family = AF_INET;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_protocol = IPPROTO_TCP;
|
||||
|
||||
if (::getaddrinfo(address.ToString().c_str(), std::to_string(static_cast<int>(port)).c_str(), &hints, &result) != 0) {
|
||||
std::cerr << "Failed to get address info !\n";
|
||||
return false;
|
||||
}
|
||||
if (::getaddrinfo(address.ToString().c_str(), std::to_string(static_cast<int>(port)).c_str(), &hints, &result) != 0) {
|
||||
std::cerr << "Failed to get address info !\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((m_Handle = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
|
||||
std::cerr << "Failed to create socket !\n";
|
||||
return false;
|
||||
}
|
||||
if ((m_Handle = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
|
||||
std::cerr << "Failed to create socket !\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
struct addrinfo* ptr = nullptr;
|
||||
for (ptr = result; ptr != nullptr; ptr = ptr->ai_next) {
|
||||
struct sockaddr* sockaddr = ptr->ai_addr;
|
||||
if (::connect(m_Handle, sockaddr, sizeof(sockaddr_in)) != 0) {
|
||||
std::cerr << "Failed to connect with this address !\n";
|
||||
continue;
|
||||
}
|
||||
m_RemoteAddr = *sockaddr;
|
||||
break;
|
||||
}
|
||||
struct addrinfo* ptr = nullptr;
|
||||
for (ptr = result; ptr != nullptr; ptr = ptr->ai_next) {
|
||||
struct sockaddr* sockaddr = ptr->ai_addr;
|
||||
if (::connect(m_Handle, sockaddr, sizeof(sockaddr_in)) != 0) {
|
||||
std::cerr << "Failed to connect with this address !\n";
|
||||
continue;
|
||||
}
|
||||
m_RemoteAddr = *sockaddr;
|
||||
break;
|
||||
}
|
||||
|
||||
freeaddrinfo(result);
|
||||
freeaddrinfo(result);
|
||||
|
||||
if (!ptr) {
|
||||
std::cerr << "Could not find a suitable interface for connecting !\n";
|
||||
return false;
|
||||
}
|
||||
if (!ptr) {
|
||||
std::cerr << "Could not find a suitable interface for connecting !\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
this->SetStatus(Connected);
|
||||
m_RemoteIP = address;
|
||||
m_Port = port;
|
||||
return true;
|
||||
this->SetStatus(Connected);
|
||||
m_RemoteIP = address;
|
||||
m_Port = port;
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t TCPSocket::Send(const unsigned char* data, size_t size) {
|
||||
if (this->GetStatus() != Connected)
|
||||
return 0;
|
||||
if (this->GetStatus() != Connected)
|
||||
return 0;
|
||||
|
||||
size_t sent = 0;
|
||||
size_t sent = 0;
|
||||
|
||||
while (sent < size) {
|
||||
int cur = ::send(m_Handle, reinterpret_cast<const char*>(data + sent), size - sent, 0);
|
||||
if (cur <= 0) {
|
||||
Disconnect();
|
||||
return 0;
|
||||
}
|
||||
sent += static_cast<std::size_t>(cur);
|
||||
}
|
||||
while (sent < size) {
|
||||
int cur = ::send(m_Handle, reinterpret_cast<const char*>(data + sent), size - sent, 0);
|
||||
if (cur <= 0) {
|
||||
Disconnect();
|
||||
return 0;
|
||||
}
|
||||
sent += static_cast<std::size_t>(cur);
|
||||
}
|
||||
|
||||
return sent;
|
||||
return sent;
|
||||
}
|
||||
|
||||
std::size_t TCPSocket::Receive(DataBuffer& buffer, std::size_t amount) {
|
||||
buffer.Resize(amount);
|
||||
buffer.SetReadOffset(0);
|
||||
buffer.Resize(amount);
|
||||
buffer.SetReadOffset(0);
|
||||
|
||||
int recvAmount = ::recv(m_Handle, reinterpret_cast<char*>(buffer.data()), amount, 0);
|
||||
if (recvAmount <= 0) {
|
||||
int recvAmount = ::recv(m_Handle, reinterpret_cast<char*>(buffer.data()), amount, 0);
|
||||
if (recvAmount <= 0) {
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
int err = WSAGetLastError();
|
||||
int err = WSAGetLastError();
|
||||
#else
|
||||
int err = errno;
|
||||
int err = errno;
|
||||
#endif
|
||||
if (err == WOULDBLOCK) {
|
||||
buffer.Clear();
|
||||
return 0;
|
||||
}
|
||||
if (err == WOULDBLOCK) {
|
||||
buffer.Clear();
|
||||
return 0;
|
||||
}
|
||||
|
||||
Disconnect();
|
||||
buffer.Clear();
|
||||
return 0;
|
||||
}
|
||||
buffer.Resize(static_cast<std::size_t>(recvAmount));
|
||||
return static_cast<std::size_t>(recvAmount);
|
||||
Disconnect();
|
||||
buffer.Clear();
|
||||
return 0;
|
||||
}
|
||||
buffer.Resize(static_cast<std::size_t>(recvAmount));
|
||||
return static_cast<std::size_t>(recvAmount);
|
||||
}
|
||||
|
||||
DataBuffer TCPSocket::Receive(std::size_t amount) {
|
||||
std::unique_ptr<char[]> buf(new char[amount]);
|
||||
std::unique_ptr<char[]> buf(new char[amount]);
|
||||
|
||||
int received = ::recv(m_Handle, buf.get(), amount, 0);
|
||||
int received = ::recv(m_Handle, buf.get(), amount, 0);
|
||||
|
||||
if (received <= 0) {
|
||||
if (received <= 0) {
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
int err = WSAGetLastError();
|
||||
int err = WSAGetLastError();
|
||||
#else
|
||||
int err = errno;
|
||||
int err = errno;
|
||||
#endif
|
||||
if (err == WOULDBLOCK)
|
||||
return DataBuffer();
|
||||
if (err == WOULDBLOCK)
|
||||
return DataBuffer();
|
||||
|
||||
Disconnect();
|
||||
return DataBuffer();
|
||||
}
|
||||
Disconnect();
|
||||
return DataBuffer();
|
||||
}
|
||||
|
||||
return DataBuffer(std::string(buf.get(), static_cast<std::size_t>(received)));
|
||||
return DataBuffer(std::string(buf.get(), static_cast<std::size_t>(received)));
|
||||
}
|
||||
|
||||
TCPSocket::TCPSocket(TCPSocket&& other) : Socket(TCP) {
|
||||
m_Handle = other.m_Handle;
|
||||
m_Port = other.m_Port;
|
||||
m_RemoteAddr = other.m_RemoteAddr;
|
||||
m_RemoteIP = other.m_RemoteIP;
|
||||
SetStatus(other.GetStatus());
|
||||
SetBlocking(other.IsBlocking());
|
||||
other.m_Handle = static_cast<SocketHandle>(INVALID_SOCKET);
|
||||
m_Handle = other.m_Handle;
|
||||
m_Port = other.m_Port;
|
||||
m_RemoteAddr = other.m_RemoteAddr;
|
||||
m_RemoteIP = other.m_RemoteIP;
|
||||
SetStatus(other.GetStatus());
|
||||
SetBlocking(other.IsBlocking());
|
||||
other.m_Handle = static_cast<SocketHandle>(INVALID_SOCKET);
|
||||
}
|
||||
|
||||
void SendPacket(const DataBuffer& data, network::TCPSocket& socket) {
|
||||
DataBuffer compressed = utils::Compress(data);
|
||||
socket.Send(reinterpret_cast<const std::uint8_t*>(compressed.ToString().data()), compressed.GetSize());
|
||||
DataBuffer compressed = utils::Compress(data);
|
||||
socket.Send(reinterpret_cast<const std::uint8_t*>(compressed.ToString().data()), compressed.GetSize());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -12,92 +12,91 @@ namespace td {
|
||||
namespace network {
|
||||
|
||||
UDPSocket::UDPSocket()
|
||||
: Socket(Socket::UDP), m_Port(0)
|
||||
{
|
||||
m_Handle = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
: Socket(Socket::UDP), m_Port(0) {
|
||||
m_Handle = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
}
|
||||
|
||||
bool UDPSocket::Connect(const IPAddress& address, unsigned short port) {
|
||||
if (this->GetStatus() == Connected)
|
||||
return true;
|
||||
if (this->GetStatus() == Connected)
|
||||
return true;
|
||||
|
||||
m_RemoteAddr.sin_port = htons(port);
|
||||
m_RemoteAddr.sin_family = AF_INET;
|
||||
m_RemoteAddr.sin_addr.s_addr = inet_addr(address.ToString().c_str());
|
||||
m_RemoteAddr.sin_port = htons(port);
|
||||
m_RemoteAddr.sin_family = AF_INET;
|
||||
m_RemoteAddr.sin_addr.s_addr = inet_addr(address.ToString().c_str());
|
||||
|
||||
this->SetStatus(Connected);
|
||||
m_RemoteIP = IPAddress(address);
|
||||
m_Port = port;
|
||||
return true;
|
||||
this->SetStatus(Connected);
|
||||
m_RemoteIP = IPAddress(address);
|
||||
m_Port = port;
|
||||
return true;
|
||||
}
|
||||
|
||||
std::size_t UDPSocket::Send(const unsigned char* data, std::size_t size) {
|
||||
std::size_t sent = 0;
|
||||
std::size_t sent = 0;
|
||||
|
||||
if (this->GetStatus() != Connected)
|
||||
return 0;
|
||||
if (this->GetStatus() != Connected)
|
||||
return 0;
|
||||
|
||||
while (sent < size) {
|
||||
int cur = ::sendto(m_Handle, reinterpret_cast<const char*>(data + sent), size - sent, 0,
|
||||
reinterpret_cast<sockaddr*>(&m_RemoteAddr), sizeof(sockaddr_in));
|
||||
if (cur <= 0) {
|
||||
Disconnect();
|
||||
return 0;
|
||||
}
|
||||
sent += static_cast<std::size_t>(cur);
|
||||
}
|
||||
while (sent < size) {
|
||||
int cur = ::sendto(m_Handle, reinterpret_cast<const char*>(data + sent), size - sent, 0,
|
||||
reinterpret_cast<sockaddr*>(&m_RemoteAddr), sizeof(sockaddr_in));
|
||||
if (cur <= 0) {
|
||||
Disconnect();
|
||||
return 0;
|
||||
}
|
||||
sent += static_cast<std::size_t>(cur);
|
||||
}
|
||||
|
||||
return sent;
|
||||
return sent;
|
||||
}
|
||||
|
||||
DataBuffer UDPSocket::Receive(std::size_t amount) {
|
||||
std::unique_ptr<char[]> buf(new char[amount]);
|
||||
socklen_t slen = sizeof(sockaddr_in);
|
||||
std::unique_ptr<char[]> buf(new char[amount]);
|
||||
socklen_t slen = sizeof(sockaddr_in);
|
||||
|
||||
int received = ::recvfrom(m_Handle, buf.get(), amount, 0,
|
||||
reinterpret_cast<sockaddr*>(&m_RemoteAddr), &slen);
|
||||
int received = ::recvfrom(m_Handle, buf.get(), amount, 0,
|
||||
reinterpret_cast<sockaddr*>(&m_RemoteAddr), &slen);
|
||||
|
||||
if (received <= 0) {
|
||||
if (received <= 0) {
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
int err = WSAGetLastError();
|
||||
int err = WSAGetLastError();
|
||||
#else
|
||||
int err = errno;
|
||||
int err = errno;
|
||||
#endif
|
||||
if (err == WOULDBLOCK)
|
||||
return DataBuffer(std::string(buf.get(), static_cast<std::size_t>(received)));
|
||||
if (err == WOULDBLOCK)
|
||||
return DataBuffer(std::string(buf.get(), static_cast<std::size_t>(received)));
|
||||
|
||||
Disconnect();
|
||||
return DataBuffer();
|
||||
}
|
||||
Disconnect();
|
||||
return DataBuffer();
|
||||
}
|
||||
|
||||
return DataBuffer(std::string(buf.get(), static_cast<std::size_t>(received)));
|
||||
return DataBuffer(std::string(buf.get(), static_cast<std::size_t>(received)));
|
||||
}
|
||||
|
||||
std::size_t UDPSocket::Receive(DataBuffer& buffer, std::size_t amount) {
|
||||
buffer.Resize(amount);
|
||||
buffer.SetReadOffset(0);
|
||||
buffer.Resize(amount);
|
||||
buffer.SetReadOffset(0);
|
||||
|
||||
socklen_t slen = sizeof(sockaddr_in);
|
||||
socklen_t slen = sizeof(sockaddr_in);
|
||||
|
||||
int recvAmount = ::recvfrom(m_Handle, reinterpret_cast<char*>(buffer.data()), amount, 0,
|
||||
reinterpret_cast<sockaddr*>(&m_RemoteAddr), &slen);
|
||||
if (recvAmount <= 0) {
|
||||
int recvAmount = ::recvfrom(m_Handle, reinterpret_cast<char*>(buffer.data()), amount, 0,
|
||||
reinterpret_cast<sockaddr*>(&m_RemoteAddr), &slen);
|
||||
if (recvAmount <= 0) {
|
||||
#if defined(_WIN32) || defined(WIN32)
|
||||
int err = WSAGetLastError();
|
||||
int err = WSAGetLastError();
|
||||
#else
|
||||
int err = errno;
|
||||
int err = errno;
|
||||
#endif
|
||||
if (err == WOULDBLOCK) {
|
||||
buffer.Clear();
|
||||
return 0;
|
||||
}
|
||||
if (err == WOULDBLOCK) {
|
||||
buffer.Clear();
|
||||
return 0;
|
||||
}
|
||||
|
||||
Disconnect();
|
||||
buffer.Clear();
|
||||
return 0;
|
||||
}
|
||||
buffer.Resize(static_cast<std::size_t>(recvAmount));
|
||||
return static_cast<std::size_t>(recvAmount);
|
||||
Disconnect();
|
||||
buffer.Clear();
|
||||
return 0;
|
||||
}
|
||||
buffer.Resize(static_cast<std::size_t>(recvAmount));
|
||||
return static_cast<std::size_t>(recvAmount);
|
||||
}
|
||||
|
||||
} // ns network
|
||||
|
||||
Reference in New Issue
Block a user