From 31091dcbec2070c4e0e7ab266ceb3e2d63067b7b Mon Sep 17 00:00:00 2001 From: marcelb Date: Tue, 23 May 2023 22:53:01 +0200 Subject: [PATCH] Throwing exceptions --- README.md | 13 +++++ lib/tcp_socket.hpp | 20 ++++++++ src/tcp_socket.cpp | 124 ++++++++++++++++++++++++++++++++------------- test/client.cpp | 6 +++ test/client.o | Bin 39984 -> 40544 bytes test/server.cpp | 8 +-- 6 files changed, 134 insertions(+), 37 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..4b1f9d5 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ + +# A simple TCP socket library for C++ + + +Object-oriented implemented library for easy creation and management of TCP sockets. + +## Features + +- Client aplication +- Server aplication +- Timeout connection +- SSL certificate + diff --git a/lib/tcp_socket.hpp b/lib/tcp_socket.hpp index f2d25af..c732f4b 100644 --- a/lib/tcp_socket.hpp +++ b/lib/tcp_socket.hpp @@ -14,6 +14,11 @@ using namespace std; +/** + * Server klasa za TCP/IP soket + * Instanca se incijalizira kada pokrećemo server +*/ + class server { public: int sock; @@ -24,6 +29,11 @@ class server { }; +/** + * Klasa za konstrukciju i destrukciju SSL certifikata + * Pokreće se za server i client - (različiti konstruktori) +*/ + class secure { public: SSL_CTX* fds; @@ -34,6 +44,11 @@ class secure { }; + +/** + * Klasa za definiranje TCP soketa kod klijentskih aplikacija +*/ + class client { public: int sock; @@ -47,6 +62,11 @@ class client { }; +/** + * Klasa za inicijalizaciju dolaznih veza + * Definira se na serverskom tipu aplikacija i predstavlja identifikator klijenta +*/ + class comming { public: const server *srv; diff --git a/src/tcp_socket.cpp b/src/tcp_socket.cpp index 7f6ae7e..653aba8 100644 --- a/src/tcp_socket.cpp +++ b/src/tcp_socket.cpp @@ -1,5 +1,9 @@ #include "../lib/tcp_socket.hpp" +/** + * Kontrustruktor varijable tipa server, prima port i limit za ograničenje liste klijenata na čekanju +*/ + server::server (const ushort port, const uint limit) { addr.sin_family = AF_INET; @@ -8,47 +12,59 @@ server::server (const ushort port, const uint limit) { sock = socket(AF_INET, SOCK_STREAM, 0); if (sock <= 0) { - printf("[ERROR] Ne mogu otvoriti defenirani TCP/IP socket!"); + throw "[ERROR] Unable to open TCP socket "; + } int opt=1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { - printf("[ERROR] Ne mogu otvoriti defenirani TCP/IP socket!"); + throw "[ERROR] Unable to set REUSEADDR or REUSEPORT on socket "; } if (bind(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { - printf("[ERROR] Ne mogu bindati defenirani TCP/IP socket!"); + throw "[ERROR] Unable to bind socket "; } if (listen(sock, limit) < 0) { - printf("[ERROR] Ne mogu defenirani listen za TCP/IP socket!"); + throw "[ERROR] It is not possible to set the allowed number of waiting clients "; } } +/** + * Destruktor varijable tipa server +*/ + server::~server () { if (sock<=0) { - printf ("[ERROR] Soket destruktor: već zatvoren soket!"); + throw "[ERROR] The socket is already closed "; } else if (close(sock) != 0) { - printf ("[ERROR] Soket destruktor nije mogao zatvoriti soket!"); + throw "[ERROR] Unable to close socket "; } } +/** + * Konstruktor varijable tipa secure za klijentske implementacije +*/ secure::secure() { fds = SSL_CTX_new(SSLv23_client_method()); if (!fds) { - //throw "[ERROR] Creating SSL context "; - cout << endl << "[ERROR] Creating SSL context "; + throw "[ERROR] Creating SSL context "; } } + +/** + * Konstruktor varijable tipa secure za serverske implementacije +*/ + secure::secure(const string cert, const string priv) { SSL_library_init(); @@ -58,33 +74,40 @@ secure::secure(const string cert, const string priv) { // Create an SSL context fds = SSL_CTX_new(SSLv23_server_method()); if (!fds) { - // throw "[ERROR] Creating SSL context "; - cout << endl << "[ERROR] Creating SSL context "; + throw "[ERROR] Creating SSL context "; } // Load the server's certificate and private key files if (SSL_CTX_use_certificate_file(fds, cert.c_str(), SSL_FILETYPE_PEM) <= 0) { - // throw "[ERROR] Loading certificate file."; - cout << endl << "[ERROR] Loading certificate file."; + throw "[ERROR] Loading certificate file "; } if (SSL_CTX_use_PrivateKey_file(fds, priv.c_str(), SSL_FILETYPE_PEM) <= 0) { - //throw "[ERROR] Loading private key file."; - cout << endl << "[ERROR] Loading private key file."; + throw "[ERROR] Loading private key file "; } } +/** + * Destruktor varijable tipa secure +*/ + + secure::~secure () { SSL_CTX_free(fds); } +/** + * Konstruktor varijable tipa client + * Prima adresu, port, i opcijonalno dozvoljeno vrijeme čekanja servera + * i deskriptor datoteke SSL certifikat za sigurne komunikacije +*/ client::client(const string address, const ushort port, const uint timeout, SSL_CTX* securefds) { sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { - printf("[ERROR] Ne mogu otvoriti TCP/IP socket!"); + throw "[ERROR] Unable to open TCP socket "; } const string _address = isIPAddress(address) ? address : ipFromDomain(address); @@ -94,23 +117,21 @@ client::client(const string address, const ushort port, const uint timeout, SSL_ addr.sin_port = htons(port); if (connect(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) != 0) { - printf("[EROR] Ne mogu se povezati s poslužiteljem!"); + throw "Unable to connect to server "; } struct timeval tv; - tv.tv_sec = 0; // za sad 2 sekunde timeout, harkodirano + tv.tv_sec = 0; tv.tv_usec = timeout*1000; if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval))) { - printf ("[ERROR] 503 Ne mogu postaviti timeout!"); - sock = -1; + throw "[ERROR] Unable to set timeout "; } if (securefds) { ssl = SSL_new(securefds); if (!ssl) { - //throw "[ERROR] Creating SSL object."; - cout << endl << "[ERROR] Creating SSL object."; + throw "[ERROR] Creating SSL object "; } SSL_set_fd(ssl, sock); @@ -118,13 +139,16 @@ client::client(const string address, const ushort port, const uint timeout, SSL_ // Perform the SSL handshake if (SSL_connect(ssl) <= 0) { SSL_free(ssl); - // throw "[ERROR] Performing SSL handshake."; - cout << endl << "[ERROR] Performing SSL handshake."; + throw "[ERROR] Performing SSL handshake "; } } +/** + * Destruktor varijable tipa client +*/ + client::~client () { if (ssl) { @@ -133,15 +157,21 @@ client::~client () { } if (sock <= 0) { - printf ("[ERROR] Soket destruktor: već zatvoren soket!"); + throw "[ERROR] The socket is already closed "; } else if (close(sock) != 0) { - printf ("[ERROR] Soket destruktor nije mogao zatvoriti soket!"); + throw "[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; @@ -154,6 +184,12 @@ bool client::tell (const string msg) { 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}; @@ -167,6 +203,12 @@ string client::obey (size_t byte_limit) { return (string) res; } +/** + * Konstruktor varijable tipa commint + * Prima pokazivač na inicijaliziranu varijablu tipa, port, + * i opcijonalno dozvoljeno vrijeme čekanja servera i deskriptor datoteke + * SSL certifikat za sigurne komunikacije +*/ comming::comming(const server *_srv, const uint timeout, SSL_CTX* securefds) { @@ -174,7 +216,7 @@ comming::comming(const server *_srv, const uint timeout, SSL_CTX* securefds) { socklen_t len = sizeof(struct sockaddr_in); if ((conn = accept(srv->sock, (struct sockaddr *)&(srv->addr), (socklen_t*)&len)) < 0) { - printf("[ERROR] Ne mogu preuzeti vezu klijenta!"); + throw "[ERROR] Unable to accept client connection "; } struct timeval tv; @@ -182,23 +224,20 @@ comming::comming(const server *_srv, const uint timeout, SSL_CTX* securefds) { tv.tv_usec = 0; if (setsockopt(conn, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval))) { - printf("[ERROR] 503 Ne mogu postaviti timeout!"); - conn = -1; + throw "[ERROR] Unable to set timeout "; } if (securefds) { ssl = SSL_new(securefds); if (!ssl) { - // throw "[ERROR] Creating SSL object."; - cout << endl << "[ERROR] Creating SSL object."; + throw "[ERROR] Creating SSL object "; } SSL_set_fd(ssl, conn); // Perform SSL handshake if (SSL_accept(ssl) <= 0) { SSL_free(ssl); - // throw "[ERROR] Performing SSL handshake."; - cout << endl << "[ERROR] Performing SSL handshake."; + throw "[ERROR] Performing SSL handshake "; } } @@ -213,6 +252,10 @@ comming::comming(const server *_srv, const uint timeout, SSL_CTX* securefds) { } +/** + * Destruktor varijable tipa comming +*/ + comming::~comming() { if (ssl) { @@ -221,14 +264,20 @@ comming::~comming() { } if (conn <= 0) { - printf ("[ERROR] Comming destruktor: već zatvoren soket!"); + throw "[ERROR] The socket is already closed "; } else if (close(conn) != 0) { - printf ("[ERROR] Comming destruktor nije mogao zatvoriti soket!"); + throw "[ERROR] Unable to close socket "; } } +/** + * Metoda klase comming 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 comming::tell (const string msg) { ssize_t sended = 0; if (ssl) { @@ -240,6 +289,13 @@ bool comming::tell (const string msg) { return sended == msg.length(); } + +/** + * Metoda klase comming za primanje poruke preko soketa + * Prima dozvoljeni broj karaktera koji će primiti + * Vraća string primljene poruke +*/ + string comming::obey (size_t byte_limit) { char res[byte_limit] = {0}; diff --git a/test/client.cpp b/test/client.cpp index ca4a890..6584194 100644 --- a/test/client.cpp +++ b/test/client.cpp @@ -6,12 +6,18 @@ using namespace std; int main() { + try { + secure crypto; client myserver("localhost", 5000, 500, crypto.fds); string sends = "Hello world!"; cout << myserver.tell(sends) << " " << sends.length() << endl; cout << myserver.obey(); + } + catch (const string err) { + cout << err << endl; + } return 0; } \ No newline at end of file diff --git a/test/client.o b/test/client.o index 012ee4cc0852f39ad5b145a440d445484f7ec268..526ad20060c39f6307080a8bf84129e82377af9a 100755 GIT binary patch literal 40544 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%0Ajj?1bal zj-A#4ZOd4iJ}zby$F&X60#HjIgWq8*%u6ihDP}0M>SXYPu<4#<)l7q&sY>`~8Q!?l z&d{-OiM}lmzYFm{BNWSJRQhmut*lcgfD?EWa&vHx-h@TV34lHeq(887dZHU~5%Uw< zLs4W`D!LP`*UZv9>t|-ELAEZpNM~j1L5uXQJfY4a{oBOtrDp5jEz(aGdTBx~Etyc_ zsFm?S^G(_MMv!z!?zJXJsxsd+eH0`$lKfbQpl{8uSf!)&sgIqGpazr0r@kx0fzusB zLD64~=`X^hR24_iqVRh-E_$C|92)!lqR`mq7mvn1zX#+JrV@H*YE)EFp4!33EKv&R z2o*bYNPJ98IBRiBW&XQ!tl1ic-!rh(;!kmFL#4E=w}e{&El5XVeW{mBOs% z;zZMg7pn~|@GK42v!`p|8wF%8j+7Y=hyIFD=PlH9a>zB)CKpit%(R|y(#R^6ujhNW zCUv}AHreb*IfUyF+o*FDSmQy%o|G!(f?*V9uh@S*$qv7Zk4#y5Hk;O>t-* zJv}SkR4{=y%u09YKUC1dlHP!nEZL>GbY@ojc!#7zb)L?XHeVOyZXI=yOE1H zY(YQAgfe?dPXSBfWJL3lhJS}gS1vbA6zc6{j+N}>@(yg(gu~n^#nNxR`KHWt+T$G( zvZ1#sxqzZ7#)hQyQhNn7vtnRqzP89$n&`cXPVFM4bvY{gZIwug{PI8lAuK`;rmmj~ z^Ox^jmT35>2h~2GGF)B+9%YJ^f-6NgQ2kZ>l%RoY$4O0ht`=SgP0G()mkTSGJ;rDr z`MBef13Vd)BP&HWu%IXMPYxX0G_7w2s$4#$xa?tW{w3y`q9lFSsXR%#4xE3Iuv9w< z#I+8l1G|Os3Tj)q*`uRTcL=n&DJD z*XD9!EAtowQ=(<>9OjU5{bxE|G`}URCI3~_|KysS^MX_3dCQ@Q3k~#B&8p8OV2Q6p zF0phS+I>X5mh1e@IAM5vEu*^uoc*_4dNPhKmfx)9Nj%=ba#uPtkAMBbHHrF~s9RI+ ze489aGf{UJ^+2xk$A_z{!(Pd8HJ1|L?6>8L@M`#n+EysmRF<%{;$s@Oc|)k|dm7$y zErcPv_@RlEQ>n^DYWe8^oJZF;O~v=B1V^Q70gnr{>r2Q)@)p%}H4*8Oz~iKGRXU>5 zYeFkKLLFBJZASF1{96tGAXAmr@xRmV1vbZFa5J_ERx6Juqs)F~&x$foDWLoagmB9a7 zCXWJl(p#o>@-<=37;<{q%L$pWhBY zTBe5Dkos4DKQM^$SEk@MNm=z@tXyQSpS5POndEhk*Z+E52U*Ufs^>GJ^vhYNPTKu^ zMqB*~*D0=S)B5zlg{xn@>nV4AW+VdPlB3Zks#>2BrQh2+okF|UXC&yiyH4#mO1Us` zQ1}b8k<_XeGD31X30TUZcVFleRiO2B8cFhojJEnAqf^|`gEpjx>Stt89?jn{Bx;W~ z1*$zfN6^1EB!%c#-afjsp-+@lsBtwqhH^J%M2(rCqB@;HRU0$H3l^xT_&pyLhqj|5 z8=WEgg8?3ZHg;>zqtV?q|2A;mi+uvmJg=3hR>slp7n5W=oe}l!bxCp}C2z6;$=>vU u+>we!d)}sjQJxv9#tdyYCDMUS8KFBCspybsGQHG0#y&l=L3~z5D_I diff --git a/test/server.cpp b/test/server.cpp index be48d89..32582e2 100644 --- a/test/server.cpp +++ b/test/server.cpp @@ -5,7 +5,7 @@ using namespace std; int main() { - +try{ cout << "init server " << endl; server myserver(5000, 10); cout << "init cert " << endl; @@ -31,7 +31,9 @@ int main() { // } // sleep(80); - - +} +catch(const string err) { + cout << err << endl; +} return 0; } \ No newline at end of file