parent
fbf15c619f
commit
48bc454097
3 changed files with 157 additions and 0 deletions
@ -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…
Reference in New Issue