diff --git a/bakanet/src/platform/windows/windows_ip_adress.cpp b/bakanet/src/platform/windows/windows_ip_adress.cpp index e69de29..cd58b41 100755 --- a/bakanet/src/platform/windows/windows_ip_adress.cpp +++ b/bakanet/src/platform/windows/windows_ip_adress.cpp @@ -0,0 +1,15 @@ +#include +#include + +namespace Bk::Net { + struct in_addr IpAddress::get_data() + { + struct in_addr addr; + if (!str.length()) { + addr.s_addr = INADDR_ANY; + return addr; + } + else if (InetPton(AF_INET, (PWSTR)str.c_str(), &addr) <= 0) perror("Bad IP"); + return addr; + } +} \ No newline at end of file diff --git a/bakanet/src/platform/windows/windows_socket.cpp b/bakanet/src/platform/windows/windows_socket.cpp index e69de29..6729a75 100755 --- a/bakanet/src/platform/windows/windows_socket.cpp +++ b/bakanet/src/platform/windows/windows_socket.cpp @@ -0,0 +1,110 @@ +#include "windows_socket.h" +#include + +namespace Bk::Net { + int WindowsSocket::socket_count = 0; + + WindowsSocket::WindowsSocket(IpAddress ip, int port, IpProtocol proto) + : ip_addr(ip), ip_proto(proto) + { + if (socket_count++ < 1) + { + WSADATA wsa_data; + int err; + err = WSAStartup(MAKEWORD(2, 2), &wsa_data); + if (err != 0) + { + log("WSA failed " << WSAGetLastError()); + WSACleanup(); + system("pause"); + exit(EXIT_FAILURE); + } + } + + //WindowsSocket creation step + if ((socket_id = (int)socket((int)ip_addr.version, (int)ip_proto, 0)) < 0) + { + log("socket failed " << WSAGetLastError()); + exit(EXIT_FAILURE); + } + addr.sin_addr = ip_addr.get_data(); + addr.sin_family = (int)ip_addr.version; + addr.sin_port = htons(port); + } + + WindowsSocket::~WindowsSocket() + { + WSACleanup(); + closesocket(socket_id); + } + + bool WindowsSocket::init() + { + //Binding step + int status; + if ((status = bind(socket_id, (struct sockaddr*)&addr, sizeof(addr)) < 0)) + { + log("bind failed " << WSAGetLastError()); + return false; + } + return true; + } + + bool WindowsSocket::start(int cpt_conn = SOMAXCONN) + { + //Listening step + if (listen(socket_id, cpt_conn) == SOCKET_ERROR) + { + return false; + } + return true; + } + + Connection WindowsSocket::ack() + { + socklen_t addrlen = sizeof(addr); + return accept(socket_id, (struct sockaddr*)&addr, &addrlen); + } + + bool WindowsSocket::conn() + { + if (connect(socket_id, (struct sockaddr*)&addr, sizeof(addr)) < 0) + { + return false; + } + return true; + } + + void WindowsSocket::emit(std::vector packet) + { + send((SOCKET)socket_id, packet.data(), packet.size(), 0); + } + + void WindowsSocket::emit(Connection conn, std::vector packet) + { + send((SOCKET)conn, packet.data(), packet.size(), 0); + } + + std::vector WindowsSocket::obtain(int size) + { + std::vector buffer; + buffer.resize(size); + int read_size = recv((SOCKET)socket_id, buffer.data(), buffer.size() - 1, 0); + buffer.resize(read_size); + return buffer; + } + + std::vector WindowsSocket::obtain(Connection conn, int size) + { + std::vector buffer; + buffer.resize(size); + int read_size = recv((SOCKET)conn, buffer.data(), buffer.size() - 1, 0); + buffer.resize(read_size); + return buffer; + } + + std::unique_ptr Socket::create(IpAddress ip, int port, IpProtocol proto) + { + return std::unique_ptr(new WindowsSocket(ip, port, proto)); + } +} \ No newline at end of file diff --git a/bakanet/src/platform/windows/windows_socket.h b/bakanet/src/platform/windows/windows_socket.h index e69de29..c354b9e 100755 --- a/bakanet/src/platform/windows/windows_socket.h +++ b/bakanet/src/platform/windows/windows_socket.h @@ -0,0 +1,32 @@ +#pragma once + +#include + +namespace Bk::Net { + class WindowsSocket : public Socket + { + public: + static int socket_count; + + WindowsSocket(IpAddress ip, int port, IpProtocol proto); + virtual ~WindowsSocket(); + + bool init() override; + bool start(int cpt_conn) override; + Connection ack() override; + bool conn() override; + + int get_raw_socket() override { return socket_id; } + + void emit(std::vector packet) override; + void emit(Connection socket, std::vector packet) override; + std::vector obtain(int size) override; + std::vector obtain(Connection conn, int size) override; + + private: + Connection socket_id; + struct sockaddr_in addr; + IpAddress ip_addr; + IpProtocol ip_proto; + }; +} \ No newline at end of file