diff --git a/lib/ip.hpp b/lib/ip.hpp index 81b07de..471f3a0 100644 --- a/lib/ip.hpp +++ b/lib/ip.hpp @@ -4,9 +4,16 @@ #include #include #include -#include -#include -#include + +#if __linux__ + #include + #include + #include +#elif _WIN32 + // #include + #include + #include +#endif using namespace std; diff --git a/lib/tcp_socket.hpp b/lib/tcp_socket.hpp index d5a757f..2d42539 100644 --- a/lib/tcp_socket.hpp +++ b/lib/tcp_socket.hpp @@ -13,9 +13,11 @@ #include #include #elif _WIN32 - // #include #include #include + #pragma comment(lib,"ws2_32.lib") + #define ushort u_short + #define uint u_int #endif #include "ip.hpp" @@ -34,7 +36,11 @@ class client; class server { public: - int sock; + #if __linux__ + int sock; + #elif _WIN32 + SOCKET sock; + #endif struct sockaddr_in addr; SSL_CTX* securefds = NULL; @@ -70,7 +76,11 @@ class secure { class client { public: // zajedničke - int conn; // mijenja sock + #if __linux__ + int conn; // mijenja sock + #elif _WIN32 + SOCKET conn; // mijenja sock + #endif struct sockaddr_in addr; SSL* ssl = NULL; // server s klijentima diff --git a/src/tcp_socket.cpp b/src/tcp_socket.cpp index c31563f..fd26359 100644 --- a/src/tcp_socket.cpp +++ b/src/tcp_socket.cpp @@ -11,6 +11,13 @@ server::server (const ushort port, const uint limit, SSL_CTX* _securefds) { addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(port); + #if _WIN32 + WSADATA wsa; + if (WSAStartup(MAKEWORD(2,2),&wsa) != 0) { + throw string("[ERROR] WSA Startup. Detail: " + to_string(WSAGetLastError())); + } + #endif + sock = socket(AF_INET, SOCK_STREAM, 0); if (sock <= 0) { throw string("[ERROR] Unable to open TCP socket "); @@ -18,9 +25,16 @@ server::server (const ushort port, const uint limit, SSL_CTX* _securefds) { } int opt=1; - if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { - throw string("[ERROR] Unable to set REUSEADDR or REUSEPORT on socket "); - } + #if __linux__ + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { + throw string("[ERROR] Unable to set REUSEADDR or REUSEPORT on socket "); + } + #elif _WIN32 + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt))) { + throw string("[ERROR] Unable to set REUSEADDR or REUSEPORT on socket "); + } + #endif + if (bind(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { throw string("[ERROR] Unable to bind socket "); @@ -50,10 +64,21 @@ server::~server () { throw string("[ERROR] The socket is already closed "); } - else if (close(sock) != 0) { - throw string("[ERROR] Unable to close socket "); - } + else { + #if __linux__ + if (close(sock) != 0) { + throw string("[ERROR] Unable to close socket "); + } + #elif _WIN32 + if (closesocket(sock) != 0) { + throw string("[ERROR] Unable to close socket "); + } + WSACleanup(); + #endif + + + } } /** @@ -120,9 +145,7 @@ client::client(const string address, const ushort port, const uint timeout, SSL_ #if _WIN32 WSADATA wsa; - SOCKET s; if (WSAStartup(MAKEWORD(2,2),&wsa) != 0) { - //printf("Failed. Error Code : %d",WSAGetLastError()); throw string("[ERROR] Unable to set WinSock " + to_string(WSAGetLastError())); } #endif @@ -142,13 +165,23 @@ client::client(const string address, const ushort port, const uint timeout, SSL_ throw string("Unable to connect to server "); } - struct timeval tv; - tv.tv_sec = timeout/1000; - tv.tv_usec = (timeout%1000)*1000; + #if __linux__ + struct timeval tv; + tv.tv_sec = timeout/1000; + tv.tv_usec = (timeout%1000)*1000; - if (setsockopt(conn, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval))) { - throw string("[ERROR] Unable to set timeout "); - } + if (setsockopt(conn, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval))) { + throw string("[ERROR] Unable to set timeout "); + } + #elif _WIN32 + DWORD tv = timeout; + if (setsockopt(conn, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof(tv))) { + throw string("[ERROR] Unable to set timeout "); + } + #endif + + + if (securefds) { ssl = SSL_new(securefds); @@ -183,13 +216,23 @@ client::client(const server *_srv, const uint timeout, SSL_CTX* securefds) { throw string("[ERROR] Unable to accept client connection "); } - struct timeval tv; - tv.tv_sec = timeout/1000; - tv.tv_usec = (timeout%1000)*1000; + #if __linux__ + struct timeval tv; + tv.tv_sec = timeout/1000; + tv.tv_usec = (timeout%1000)*1000; - if (setsockopt(conn, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval))) { - throw string("[ERROR] Unable to set timeout "); - } + if (setsockopt(conn, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval))) { + throw string("[ERROR] Unable to set timeout "); + } + #elif _WIN32 + DWORD tv = timeout; + + if (setsockopt(conn, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof(tv))) { + throw string("[ERROR] Unable to set timeout "); + } + #endif + + if (securefds) { @@ -224,10 +267,6 @@ client::client(const server *_srv, const uint timeout, SSL_CTX* securefds) { client::~client () { - #if _WIN32 - WSACleanup(); - #endif - if (ssl) { SSL_shutdown(ssl); SSL_free(ssl); @@ -237,8 +276,17 @@ client::~client () { throw string("[ERROR] The socket is already closed "); } - else if (close(conn) != 0) { - throw string("[ERROR] Unable to close socket "); + else { + #if __linux__ + if (close(conn) != 0) { + throw string("[ERROR] Unable to close socket "); + } + #elif _WIN32 + if (closesocket(conn) != 0) { + throw string("[ERROR] Unable to close socket "); + } + //WSACleanup(); + #endif } } @@ -256,7 +304,7 @@ bool client::push (const string msg) { sended = SSL_write(ssl, msg.c_str(), msg.length()); } else { - sended = write(conn, msg.c_str(), msg.length()); + sended = send(conn, msg.c_str(), msg.length(), 0); } return sended == msg.length(); } @@ -274,7 +322,7 @@ string client::pull (size_t byte_limit) { SSL_read(ssl, res, byte_limit); } else { - read(conn , res, byte_limit); + recv(conn , res, byte_limit, 0); } return string(res); diff --git a/test/client.cpp b/test/client.cpp index 8a123b1..a17ae46 100644 --- a/test/client.cpp +++ b/test/client.cpp @@ -11,7 +11,7 @@ int main() { secure crypto; cout << "init cert " << endl; - client myserver("127.0.0.1", 5000, 5000, crypto.fds); + client myserver("localhost", 8000, 5000, crypto.fds); // client myserver("localhost", 5000); cout << "init client " << endl; diff --git a/test/client.exe b/test/client.exe new file mode 100644 index 0000000..1e2cb70 Binary files /dev/null and b/test/client.exe differ diff --git a/test/compile-client.ps1 b/test/compile-client.ps1 new file mode 100644 index 0000000..04954c6 --- /dev/null +++ b/test/compile-client.ps1 @@ -0,0 +1 @@ +g++ client.cpp ../src/* -o client.exe -lssl -lcrypto -lws2_32 \ No newline at end of file diff --git a/test/compile-server.ps1 b/test/compile-server.ps1 new file mode 100644 index 0000000..33efb5a --- /dev/null +++ b/test/compile-server.ps1 @@ -0,0 +1 @@ +g++ server.cpp ../src/* -o server.exe -lssl -lcrypto -lws2_32 \ No newline at end of file diff --git a/test/server.cpp b/test/server.cpp index a6255ce..0d0c2e4 100644 --- a/test/server.cpp +++ b/test/server.cpp @@ -9,7 +9,7 @@ int main() { cout << "init cert " << endl; secure crypto ("../example/cert.pem", "../example/privkey.pem"); cout << "init server " << endl; - server myserver(5000, 100, crypto.fds); + server myserver(8000, 100, crypto.fds); cout << "init client " << endl; @@ -23,7 +23,7 @@ int main() { // string fromclient = myclient.pull(); cout << "tell client " << fromclient << endl; // usleep(600*1000); - sleep(5); + //sleep(5); myserver.cli->push(fromclient); // myclient.push(fromclient); // myclient.~comming(); diff --git a/test/server.exe b/test/server.exe new file mode 100644 index 0000000..6ef2399 Binary files /dev/null and b/test/server.exe differ