Working windows implémentation

multi_plaform
ambigipathyv ago%!(EXTRA string=1 year)
parent fbf15c619f
commit 48bc454097
  1. 15
      bakanet/src/platform/windows/windows_ip_adress.cpp
  2. 110
      bakanet/src/platform/windows/windows_socket.cpp
  3. 32
      bakanet/src/platform/windows/windows_socket.h

@ -0,0 +1,15 @@
#include <bakanet/sock_layer/ip_address.h>
#include <string.h>
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;
}
}

@ -0,0 +1,110 @@
#include "windows_socket.h"
#include <iostream>
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<char> packet)
{
send((SOCKET)socket_id, packet.data(), packet.size(), 0);
}
void WindowsSocket::emit(Connection conn, std::vector<char> packet)
{
send((SOCKET)conn, packet.data(), packet.size(), 0);
}
std::vector<char> WindowsSocket::obtain(int size)
{
std::vector<char> 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<char> WindowsSocket::obtain(Connection conn, int size)
{
std::vector<char> 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> Socket::create(IpAddress ip, int port, IpProtocol proto)
{
return std::unique_ptr<Socket>(new WindowsSocket(ip, port, proto));
}
}

@ -0,0 +1,32 @@
#pragma once
#include <bakanet/sock_layer/socket.h>
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<char> packet) override;
void emit(Connection socket, std::vector<char> packet) override;
std::vector<char> obtain(int size) override;
std::vector<char> obtain(Connection conn, int size) override;
private:
Connection socket_id;
struct sockaddr_in addr;
IpAddress ip_addr;
IpProtocol ip_proto;
};
}
Loading…
Cancel
Save