|
|
@ -4,7 +4,8 @@ |
|
|
|
* Kontrustruktor varijable tipa server, prima port i limit za ograničenje liste klijenata na čekanju |
|
|
|
* Kontrustruktor varijable tipa server, prima port i limit za ograničenje liste klijenata na čekanju |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
server::server (const ushort port, const uint limit) { |
|
|
|
server::server (const ushort port, const uint limit, SSL_CTX* _securefds) { |
|
|
|
|
|
|
|
securefds = _securefds; |
|
|
|
|
|
|
|
|
|
|
|
addr.sin_family = AF_INET; |
|
|
|
addr.sin_family = AF_INET; |
|
|
|
addr.sin_addr.s_addr = INADDR_ANY; |
|
|
|
addr.sin_addr.s_addr = INADDR_ANY; |
|
|
@ -31,6 +32,10 @@ server::server (const ushort port, const uint limit) { |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void server::accept(const uint timeout) { |
|
|
|
|
|
|
|
cli = new client(this, timeout, securefds); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Destruktor varijable tipa server |
|
|
|
* Destruktor varijable tipa server |
|
|
|
*/ |
|
|
|
*/ |
|
|
@ -38,6 +43,9 @@ server::server (const ushort port, const uint limit) { |
|
|
|
|
|
|
|
|
|
|
|
server::~server () { |
|
|
|
server::~server () { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cli->~client(); |
|
|
|
|
|
|
|
cli = NULL; |
|
|
|
|
|
|
|
|
|
|
|
if (sock<=0) { |
|
|
|
if (sock<=0) { |
|
|
|
throw string("[ERROR] The socket is already closed ");
|
|
|
|
throw string("[ERROR] The socket is already closed ");
|
|
|
|
} |
|
|
|
} |
|
|
@ -110,8 +118,8 @@ secure::~secure () { |
|
|
|
|
|
|
|
|
|
|
|
client::client(const string address, const ushort port, const uint timeout, SSL_CTX* securefds) { |
|
|
|
client::client(const string address, const ushort port, const uint timeout, SSL_CTX* securefds) { |
|
|
|
|
|
|
|
|
|
|
|
sock = socket(AF_INET, SOCK_STREAM, 0); |
|
|
|
conn = socket(AF_INET, SOCK_STREAM, 0); |
|
|
|
if (sock < 0) { |
|
|
|
if (conn < 0) { |
|
|
|
throw string("[ERROR] Unable to open TCP socket "); |
|
|
|
throw string("[ERROR] Unable to open TCP socket "); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -121,7 +129,7 @@ client::client(const string address, const ushort port, const uint timeout, SSL_ |
|
|
|
addr.sin_addr.s_addr = inet_addr(_address.c_str()); |
|
|
|
addr.sin_addr.s_addr = inet_addr(_address.c_str()); |
|
|
|
addr.sin_port = htons(port); |
|
|
|
addr.sin_port = htons(port); |
|
|
|
|
|
|
|
|
|
|
|
if (connect(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) != 0) { |
|
|
|
if (connect(conn, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) != 0) { |
|
|
|
throw string("Unable to connect to server "); |
|
|
|
throw string("Unable to connect to server "); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -129,7 +137,7 @@ client::client(const string address, const ushort port, const uint timeout, SSL_ |
|
|
|
tv.tv_sec = timeout/1000; |
|
|
|
tv.tv_sec = timeout/1000; |
|
|
|
tv.tv_usec = (timeout%1000)*1000; |
|
|
|
tv.tv_usec = (timeout%1000)*1000; |
|
|
|
|
|
|
|
|
|
|
|
if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval))) { |
|
|
|
if (setsockopt(conn, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval))) { |
|
|
|
throw string("[ERROR] Unable to set timeout "); |
|
|
|
throw string("[ERROR] Unable to set timeout "); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -138,7 +146,7 @@ client::client(const string address, const ushort port, const uint timeout, SSL_ |
|
|
|
if (!ssl) { |
|
|
|
if (!ssl) { |
|
|
|
throw string("[ERROR] Creating SSL object "); |
|
|
|
throw string("[ERROR] Creating SSL object "); |
|
|
|
} |
|
|
|
} |
|
|
|
SSL_set_fd(ssl, sock); |
|
|
|
SSL_set_fd(ssl, conn); |
|
|
|
|
|
|
|
|
|
|
|
// Perform the SSL handshake
|
|
|
|
// Perform the SSL handshake
|
|
|
|
if (SSL_connect(ssl) <= 0) { |
|
|
|
if (SSL_connect(ssl) <= 0) { |
|
|
@ -150,65 +158,6 @@ client::client(const string address, const ushort port, const uint timeout, SSL_ |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Destruktor varijable tipa client |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
client::~client () { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ssl) { |
|
|
|
|
|
|
|
SSL_shutdown(ssl); |
|
|
|
|
|
|
|
SSL_free(ssl); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (sock <= 0) { |
|
|
|
|
|
|
|
throw string("[ERROR] The socket is already closed ");
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else if (close(sock) != 0) { |
|
|
|
|
|
|
|
throw string("[ERROR] Unable to close socket "); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Metoda klase client za slanje podataka preko soketa |
|
|
|
|
|
|
|
* Prima string koji će biti poslan |
|
|
|
|
|
|
|
* Vraća logički statu poređenja psolanih karaktera i karaktera u stringu |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool client::tell (const string msg) { |
|
|
|
|
|
|
|
size_t sended = 0; |
|
|
|
|
|
|
|
if (ssl) { |
|
|
|
|
|
|
|
sended = SSL_write(ssl, msg.c_str(), msg.length()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
sended = write(sock, msg.c_str(), msg.length()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return sended == msg.length(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Metoda klase client za primanje poruke preko soketa |
|
|
|
|
|
|
|
* Prima dozvoljeni broj karaktera koji će primiti |
|
|
|
|
|
|
|
* Vraća string primljene poruke |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string client::obey (size_t byte_limit) { |
|
|
|
|
|
|
|
char res[byte_limit] = {0}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ssl) { |
|
|
|
|
|
|
|
SSL_read(ssl, res, byte_limit); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
read(sock , res, byte_limit); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return string(res); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Konstruktor varijable tipa commint |
|
|
|
* Konstruktor varijable tipa commint |
|
|
|
* Prima pokazivač na inicijaliziranu varijablu tipa, port,
|
|
|
|
* Prima pokazivač na inicijaliziranu varijablu tipa, port,
|
|
|
@ -217,7 +166,7 @@ string client::obey (size_t byte_limit) { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
comming::comming(const server *_srv, const uint timeout, SSL_CTX* securefds) { |
|
|
|
client::client(const server *_srv, const uint timeout, SSL_CTX* securefds) { |
|
|
|
srv = _srv; |
|
|
|
srv = _srv; |
|
|
|
socklen_t len = sizeof(struct sockaddr_in); |
|
|
|
socklen_t len = sizeof(struct sockaddr_in); |
|
|
|
|
|
|
|
|
|
|
@ -259,11 +208,12 @@ comming::comming(const server *_srv, const uint timeout, SSL_CTX* securefds) { |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Destruktor varijable tipa comming |
|
|
|
* Destruktor varijable tipa client |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
comming::~comming() { |
|
|
|
client::~client () { |
|
|
|
|
|
|
|
|
|
|
|
if (ssl) { |
|
|
|
if (ssl) { |
|
|
|
SSL_shutdown(ssl); |
|
|
|
SSL_shutdown(ssl); |
|
|
@ -277,16 +227,18 @@ comming::~comming() { |
|
|
|
else if (close(conn) != 0) { |
|
|
|
else if (close(conn) != 0) { |
|
|
|
throw string("[ERROR] Unable to close socket "); |
|
|
|
throw string("[ERROR] Unable to close socket "); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Metoda klase comming za slanje podataka preko soketa |
|
|
|
* Metoda klase client za slanje podataka preko soketa |
|
|
|
* Prima string koji će biti poslan |
|
|
|
* Prima string koji će biti poslan |
|
|
|
* Vraća logički statu poređenja psolanih karaktera i karaktera u stringu |
|
|
|
* Vraća logički statu poređenja psolanih karaktera i karaktera u stringu |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
bool comming::tell (const string msg) { |
|
|
|
|
|
|
|
ssize_t sended = 0; |
|
|
|
bool client::push (const string msg) { |
|
|
|
|
|
|
|
size_t sended = 0; |
|
|
|
if (ssl) { |
|
|
|
if (ssl) { |
|
|
|
sended = SSL_write(ssl, msg.c_str(), msg.length()); |
|
|
|
sended = SSL_write(ssl, msg.c_str(), msg.length()); |
|
|
|
} |
|
|
|
} |
|
|
@ -296,14 +248,13 @@ bool comming::tell (const string msg) { |
|
|
|
return sended == msg.length(); |
|
|
|
return sended == msg.length(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Metoda klase comming za primanje poruke preko soketa |
|
|
|
* Metoda klase client za primanje poruke preko soketa |
|
|
|
* Prima dozvoljeni broj karaktera koji će primiti |
|
|
|
* Prima dozvoljeni broj karaktera koji će primiti |
|
|
|
* Vraća string primljene poruke |
|
|
|
* Vraća string primljene poruke |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
string comming::obey (size_t byte_limit) { |
|
|
|
string client::pull (size_t byte_limit) { |
|
|
|
char res[byte_limit] = {0}; |
|
|
|
char res[byte_limit] = {0}; |
|
|
|
|
|
|
|
|
|
|
|
if (ssl) { |
|
|
|
if (ssl) { |
|
|
@ -315,3 +266,6 @@ string comming::obey (size_t byte_limit) { |
|
|
|
|
|
|
|
|
|
|
|
return string(res); |
|
|
|
return string(res); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|