parent
da0d4cc766
commit
7958c9eace
9 changed files with 139 additions and 82 deletions
@ -0,0 +1,5 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <bakanet/ip_address.h> |
||||||
|
#include <bakanet/ip_protocol.h> |
||||||
|
#include <bakanet/socket.h> |
@ -0,0 +1,124 @@ |
|||||||
|
#include "socket.h" |
||||||
|
#include <iostream> |
||||||
|
|
||||||
|
namespace Bk::Net { |
||||||
|
|
||||||
|
std::vector<std::string> dns_lookup(const std::string &host_name, IpVersion ipv = IpVersion::IPv4) |
||||||
|
{ |
||||||
|
std::vector<std::string> output; |
||||||
|
|
||||||
|
struct addrinfo hints, *res, *p; |
||||||
|
int status, ai_family; |
||||||
|
char ip_address[INET6_ADDRSTRLEN]; |
||||||
|
|
||||||
|
ai_family = (int)ipv; |
||||||
|
memset(&hints, 0, sizeof hints); |
||||||
|
hints.ai_family = ai_family;
|
||||||
|
hints.ai_socktype = SOCK_STREAM; |
||||||
|
|
||||||
|
if ((status = getaddrinfo(host_name.c_str(), NULL, &hints, &res)) != 0) { |
||||||
|
//cerr << "getaddrinfo: "<< gai_strerror(status) << endl;
|
||||||
|
return output; |
||||||
|
} |
||||||
|
|
||||||
|
for(p = res;p != NULL; p = p->ai_next) { |
||||||
|
void *addr; |
||||||
|
if (p->ai_family == AF_INET) { // IPv4
|
||||||
|
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr; |
||||||
|
addr = &(ipv4->sin_addr); |
||||||
|
} else { // IPv6
|
||||||
|
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr; |
||||||
|
addr = &(ipv6->sin6_addr); |
||||||
|
} |
||||||
|
|
||||||
|
// convert the IP to a string
|
||||||
|
inet_ntop(p->ai_family, addr, ip_address, sizeof ip_address); |
||||||
|
output.push_back(ip_address); |
||||||
|
} |
||||||
|
|
||||||
|
freeaddrinfo(res); // free the linked list
|
||||||
|
|
||||||
|
return output; |
||||||
|
} |
||||||
|
|
||||||
|
Socket::Socket(IpAddress ip, int port,IpProtocol proto) |
||||||
|
: ip_addr(ip), ip_proto(proto) |
||||||
|
{ |
||||||
|
//Socket creation step
|
||||||
|
if ((socket_id = socket((int)ip_addr.version, (int)ip_proto, 0)) < 0)
|
||||||
|
{ |
||||||
|
perror("socket failed"); |
||||||
|
exit(EXIT_FAILURE); |
||||||
|
} |
||||||
|
addr.sin_addr = ip_addr.bytes; |
||||||
|
addr.sin_family = (int)ip_addr.version; |
||||||
|
addr.sin_port = htons(port); |
||||||
|
} |
||||||
|
|
||||||
|
Socket::~Socket() |
||||||
|
{ |
||||||
|
close(socket_id); |
||||||
|
} |
||||||
|
|
||||||
|
bool Socket::init() |
||||||
|
{ |
||||||
|
//Binding step
|
||||||
|
if (bind(socket_id, (struct sockaddr*)&addr, sizeof(addr)) < 0)
|
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
bool Socket::start(int cpt_conn) |
||||||
|
{ |
||||||
|
//Listening step
|
||||||
|
if (listen(socket_id, cpt_conn) < 0)
|
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
Connection Socket::ack() |
||||||
|
{ |
||||||
|
|
||||||
|
socklen_t addrlen = sizeof(addr); |
||||||
|
return accept(socket_id, (struct sockaddr*)&addr, &addrlen); |
||||||
|
} |
||||||
|
|
||||||
|
bool Socket::conn() |
||||||
|
{ |
||||||
|
if (connect(socket_id, (struct sockaddr*)&addr, sizeof(addr)) < 0)
|
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
void Socket::write(std::vector<char> packet) |
||||||
|
{ |
||||||
|
send(socket_id, packet.data(), packet.size(), 0); |
||||||
|
} |
||||||
|
|
||||||
|
void Socket::write(Connection conn, std::vector<char> packet) |
||||||
|
{ |
||||||
|
send(conn, packet.data(), packet.size(), 0); |
||||||
|
} |
||||||
|
|
||||||
|
std::vector<char> Socket::recv(int size) |
||||||
|
{ |
||||||
|
std::vector<char> buffer; |
||||||
|
buffer.resize(size); |
||||||
|
int status = read(socket_id, buffer.data(), buffer.size() - 1); |
||||||
|
return status ? buffer : std::vector<char>(0); |
||||||
|
} |
||||||
|
|
||||||
|
std::vector<char> Socket::recv(Connection conn, int size) |
||||||
|
{ |
||||||
|
std::vector<char> buffer; |
||||||
|
buffer.resize(size); |
||||||
|
int status = read(conn, buffer.data(), buffer.size() - 1); |
||||||
|
return status ? buffer : std::vector<char>(0); |
||||||
|
} |
||||||
|
} |
@ -1,5 +0,0 @@ |
|||||||
#pragma once |
|
||||||
|
|
||||||
#include "bakanet/ip_address.h" |
|
||||||
#include "bakanet/ip_protocol.h" |
|
||||||
#include "bakanet/socket.h" |
|
@ -1,77 +0,0 @@ |
|||||||
#include "socket.h" |
|
||||||
#include <iostream> |
|
||||||
|
|
||||||
#define log(str) std::cout << str << "\n"; |
|
||||||
|
|
||||||
namespace Bk::Net { |
|
||||||
|
|
||||||
Socket::Socket(IpAddress ip, int port,IpProtocol proto) |
|
||||||
: ip_addr(ip), ip_proto(proto) |
|
||||||
{ |
|
||||||
//Socket creation step
|
|
||||||
if ((socket_id = socket((int)ip_addr.version, (int)ip_proto, 0)) < 0)
|
|
||||||
{ |
|
||||||
perror("socket failed"); |
|
||||||
exit(EXIT_FAILURE); |
|
||||||
} |
|
||||||
addr.sin_addr = ip_addr.bytes; |
|
||||||
addr.sin_family = (int)ip_addr.version; |
|
||||||
addr.sin_port = htons(port); |
|
||||||
} |
|
||||||
|
|
||||||
Socket::~Socket() |
|
||||||
{ |
|
||||||
close(socket_id); |
|
||||||
} |
|
||||||
|
|
||||||
bool Socket::init() |
|
||||||
{ |
|
||||||
//Binding step
|
|
||||||
if (bind(socket_id, (struct sockaddr*)&addr, sizeof(addr)) < 0)
|
|
||||||
{ |
|
||||||
return false; |
|
||||||
} |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
bool Socket::start(int cpt_conn) |
|
||||||
{ |
|
||||||
//Listening step
|
|
||||||
if (listen(socket_id, cpt_conn) < 0)
|
|
||||||
{ |
|
||||||
return false; |
|
||||||
} |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
Connection Socket::ack() |
|
||||||
{ |
|
||||||
|
|
||||||
socklen_t addrlen = sizeof(addr); |
|
||||||
return accept(socket_id, (struct sockaddr*)&addr, &addrlen); |
|
||||||
} |
|
||||||
|
|
||||||
bool Socket::conn() |
|
||||||
{ |
|
||||||
if (connect(socket_id, (struct sockaddr*)&addr, sizeof(addr)) < 0)
|
|
||||||
{ |
|
||||||
return false; |
|
||||||
} |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
void Socket::write(std::vector<char> packet) |
|
||||||
{ |
|
||||||
send(socket_id, packet.data(), packet.size(), 0); |
|
||||||
} |
|
||||||
|
|
||||||
void Socket::write(Connection conn, std::vector<char> packet) |
|
||||||
{ |
|
||||||
send(conn, packet.data(), packet.size(), 0); |
|
||||||
} |
|
||||||
|
|
||||||
std::vector<char> Socket::recv(int size) |
|
||||||
{ |
|
||||||
return { 0 }; |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in New Issue