diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a757d1..2de1d59 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,12 @@ cmake_minimum_required(VERSION 3.5) project(frnetlib) +#Set module path set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules) + +#User options option(USE_SSL "Use SSL" ON) +set(FRNETLIB_BUILD_SHARED_LIBS true CACHE BOOL "Build shared library.") if(USE_SSL) FIND_PACKAGE(MBEDTLS) @@ -10,12 +14,67 @@ if(USE_SSL) add_definitions(-DSSL_ENABLED) endif() -include_directories(include) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -m64 -fPIC -pthread -lmbedtls -lmbedx509 -lmbedcrypto") +set( INCLUDE_PATH "${PROJECT_SOURCE_DIR}/include" ) +set( SOURCE_PATH "${PROJECT_SOURCE_DIR}/src" ) -set(SOURCE_FILES main.cpp src/TcpSocket.cpp include/TcpSocket.h src/TcpListener.cpp include/TcpListener.h src/Socket.cpp include/Socket.h src/Packet.cpp include/Packet.h include/NetworkEncoding.h src/SocketSelector.cpp include/SocketSelector.h src/HttpSocket.cpp include/HttpSocket.h src/HttpRequest.cpp include/HttpRequest.h src/HttpResponse.cpp include/HttpResponse.h src/Http.cpp include/Http.h src/SSLSocket.cpp include/SSLSocket.h src/SSLListener.cpp include/SSLListener.h include/SSLContext.h) -add_executable(frnetlib ${SOURCE_FILES}) +set(SOURCE_FILES main.cpp src/TcpSocket.cpp include/frnetlib/TcpSocket.h src/TcpListener.cpp include/frnetlib/TcpListener.h src/Socket.cpp include/frnetlib/Socket.h src/Packet.cpp include/frnetlib/Packet.h include/frnetlib/NetworkEncoding.h src/SocketSelector.cpp include/frnetlib/SocketSelector.h src/HttpSocket.cpp include/frnetlib/HttpSocket.h src/HttpRequest.cpp include/frnetlib/HttpRequest.h src/HttpResponse.cpp include/frnetlib/HttpResponse.h src/Http.cpp include/frnetlib/Http.h src/SSLSocket.cpp include/frnetlib/SSLSocket.h src/SSLListener.cpp include/frnetlib/SSLListener.h include/frnetlib/SSLContext.h) + +include_directories(include) + +# Set the library output directory +set( LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/lib" ) + +# Add the library. +if( FRNETLIB_BUILD_SHARED_LIBS ) + add_library( frnetlib SHARED ${SOURCE_FILES} ) + set_target_properties( frnetlib PROPERTIES DEBUG_POSTFIX -d ) +else() + add_definitions( -DFRNETLIB_STATIC ) + add_library( frnetlib ${SOURCE_FILES} ) + + set_target_properties( frnetlib PROPERTIES DEBUG_POSTFIX -s-d ) + set_target_properties( frnetlib PROPERTIES RELEASE_POSTFIX -s ) + set_target_properties( frnetlib PROPERTIES MINSIZEREL_POSTFIX -s ) +endif() + +# Tell the compiler to export when necessary. +set_target_properties( frnetlib PROPERTIES DEFINE_SYMBOL FRNETLIB_EXPORTS ) + +if( WIN32 ) + set( SHARE_PATH "." ) + set( LIB_PATH "lib" ) +elseif(APPLE) + set( SHARE_PATH "${CMAKE_INSTALL_PREFIX}/share/FRNETLIB" ) + set( LIB_PATH "lib" ) +else() + set( SHARE_PATH "${CMAKE_INSTALL_PREFIX}/share/FRNETLIB" ) + + if( LIB_SUFFIX ) + set( LIB_PATH "lib${LIB_SUFFIX}" ) + else() + set( LIB_PATH "lib" ) + endif() +endif() + + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -m64 -fPIC") if(USE_SSL) - TARGET_LINK_LIBRARIES(frnetlib ${MBEDTLS_LIBRARIES} -lmbedtls -lmbedx509 -lmbedcrypto) -endif() \ No newline at end of file + if( WIN32 ) + TARGET_LINK_LIBRARIES(frnetlib ${MBEDTLS_LIBRARIES} -lws2_32) + else() + TARGET_LINK_LIBRARIES(frnetlib ${MBEDTLS_LIBRARIES}) + endif() +endif() + +install( + TARGETS frnetlib + RUNTIME DESTINATION bin COMPONENT bin + LIBRARY DESTINATION "${LIB_PATH}" COMPONENT bin + ARCHIVE DESTINATION "${LIB_PATH}" COMPONENT dev +) + +install( + DIRECTORY include + DESTINATION . +) \ No newline at end of file diff --git a/README.md b/README.md index c877855..982ca71 100644 --- a/README.md +++ b/README.md @@ -235,7 +235,7 @@ You can both set and get GET/POST data through the fr::(HttpRequest/HttpResponse //Remove them from the selector and close the connection selector.remove(client); - client.close(); + client.close_socket(); iter = connections.erase(iter); } else diff --git a/include/Http.h b/include/frnetlib/Http.h similarity index 100% rename from include/Http.h rename to include/frnetlib/Http.h diff --git a/include/HttpRequest.h b/include/frnetlib/HttpRequest.h similarity index 100% rename from include/HttpRequest.h rename to include/frnetlib/HttpRequest.h diff --git a/include/HttpResponse.h b/include/frnetlib/HttpResponse.h similarity index 100% rename from include/HttpResponse.h rename to include/frnetlib/HttpResponse.h diff --git a/include/HttpSocket.h b/include/frnetlib/HttpSocket.h similarity index 100% rename from include/HttpSocket.h rename to include/frnetlib/HttpSocket.h diff --git a/include/NetworkEncoding.h b/include/frnetlib/NetworkEncoding.h similarity index 97% rename from include/NetworkEncoding.h rename to include/frnetlib/NetworkEncoding.h index 60b4bd3..431c57a 100644 --- a/include/NetworkEncoding.h +++ b/include/frnetlib/NetworkEncoding.h @@ -5,9 +5,26 @@ #ifndef FRNETLIB_NETWORKENCODING_H #define FRNETLIB_NETWORKENCODING_H -#include -#include #include +#include + +//Windows and UNIX require some different headers. +//We also need some compatibility defines for cross platform support. +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#else +#define closesocket(x) close(x) +#define INVALID_SOCKET 0 +#define SOCKET_ERROR -1 +#include +#include +#include +#include +#endif + #define htonll(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32)) #define ntohll(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32)) @@ -71,21 +88,4 @@ inline void set_unix_socket_blocking(int32_t socket_descriptor, bool is_blocking } -//Windows and UNIX require some different headers. -//We also need some compatibility defines for cross platform support. -#ifdef _WIN32 -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#else -#define closesocket(x) ::close(x) -#define INVALID_SOCKET 0 -#define SOCKET_ERROR -1 -#include -#include -#include -#endif - - #endif //FRNETLIB_NETWORKENCODING_H diff --git a/include/Packet.h b/include/frnetlib/Packet.h similarity index 99% rename from include/Packet.h rename to include/frnetlib/Packet.h index 7ec2206..5139a7d 100644 --- a/include/Packet.h +++ b/include/frnetlib/Packet.h @@ -5,7 +5,6 @@ #ifndef FRNETLIB_PACKET_H #define FRNETLIB_PACKET_H #include -#include #include #include #include "NetworkEncoding.h" diff --git a/include/SSLContext.h b/include/frnetlib/SSLContext.h similarity index 100% rename from include/SSLContext.h rename to include/frnetlib/SSLContext.h diff --git a/include/SSLListener.h b/include/frnetlib/SSLListener.h similarity index 98% rename from include/SSLListener.h rename to include/frnetlib/SSLListener.h index 4067a11..0486a4b 100644 --- a/include/SSLListener.h +++ b/include/frnetlib/SSLListener.h @@ -65,7 +65,7 @@ namespace fr std::shared_ptr ssl_context; //Stubs - virtual void close(){} + virtual void close_socket(){} virtual Socket::Status connect(const std::string &address, const std::string &port){return Socket::Error;} virtual Status send_raw(const char *data, size_t size) {return Socket::Error;} virtual Status receive_raw(void *data, size_t data_size, size_t &received) {return Socket::Error;} diff --git a/include/SSLSocket.h b/include/frnetlib/SSLSocket.h similarity index 98% rename from include/SSLSocket.h rename to include/frnetlib/SSLSocket.h index 1571de0..4f6af63 100644 --- a/include/SSLSocket.h +++ b/include/frnetlib/SSLSocket.h @@ -53,7 +53,7 @@ namespace fr /*! * Close the connection. */ - void close() override; + void close_socket() override; /*! * Connects the socket to an address. diff --git a/include/Socket.h b/include/frnetlib/Socket.h similarity index 95% rename from include/Socket.h rename to include/frnetlib/Socket.h index 2975769..0a4395c 100644 --- a/include/Socket.h +++ b/include/frnetlib/Socket.h @@ -30,11 +30,12 @@ namespace fr Socket() noexcept; virtual ~Socket() noexcept = default; + Socket(Socket &&) noexcept = default; /*! * Close the connection. */ - virtual void close()=0; + virtual void close_socket()=0; /*! * Connects the socket to an address. @@ -138,6 +139,11 @@ namespace fr std::string remote_address; bool is_blocking; bool is_connected; + + #ifdef _WIN32 + static WSADATA wsaData; + static uint32_t instance_count; + #endif // _WIN32 }; } diff --git a/include/SocketSelector.h b/include/frnetlib/SocketSelector.h similarity index 100% rename from include/SocketSelector.h rename to include/frnetlib/SocketSelector.h diff --git a/include/TcpListener.h b/include/frnetlib/TcpListener.h similarity index 96% rename from include/TcpListener.h rename to include/frnetlib/TcpListener.h index 5378661..a84120e 100644 --- a/include/TcpListener.h +++ b/include/frnetlib/TcpListener.h @@ -5,7 +5,6 @@ #ifndef FRNETLIB_TCPLISTENER_H #define FRNETLIB_TCPLISTENER_H #include -#include #include "TcpSocket.h" #include "Socket.h" #include "NetworkEncoding.h" @@ -40,7 +39,7 @@ private: int32_t socket_descriptor; //Stubs - virtual void close(){} + virtual void close_socket(){} virtual Socket::Status connect(const std::string &address, const std::string &port){return Socket::Error;} virtual void set_blocking(bool val){} virtual fr::Socket::Status send_raw(const char*, size_t){return Socket::Error;} diff --git a/include/TcpSocket.h b/include/frnetlib/TcpSocket.h similarity index 98% rename from include/TcpSocket.h rename to include/frnetlib/TcpSocket.h index e07b536..281ef64 100644 --- a/include/TcpSocket.h +++ b/include/frnetlib/TcpSocket.h @@ -23,7 +23,7 @@ public: /*! * Close the connection. */ - virtual void close(); + virtual void close_socket(); /*! * Connects the socket to an address. diff --git a/main.cpp b/main.cpp index 6b5f710..269f0f6 100644 --- a/main.cpp +++ b/main.cpp @@ -1,15 +1,15 @@ #include -#include -#include "include/Packet.h" -#include "include/TcpSocket.h" -#include "include/TcpListener.h" -#include "include/SocketSelector.h" -#include "HttpSocket.h" -#include "HttpRequest.h" -#include "HttpResponse.h" -#include "SSLSocket.h" -#include "SSLContext.h" -#include "SSLListener.h" +#include +#include "frnetlib/Packet.h" +#include "frnetlib/TcpSocket.h" +#include "frnetlib/TcpListener.h" +#include "frnetlib/SocketSelector.h" +#include "frnetlib/HttpSocket.h" +#include "frnetlib/HttpRequest.h" +#include "frnetlib/HttpResponse.h" +#include "frnetlib/SSLSocket.h" +#include "frnetlib/SSLContext.h" +#include "frnetlib/SSLListener.h" int main() { diff --git a/src/Http.cpp b/src/Http.cpp index f285525..675684d 100644 --- a/src/Http.cpp +++ b/src/Http.cpp @@ -3,7 +3,7 @@ // #include -#include "Http.h" +#include "frnetlib/Http.h" namespace fr { diff --git a/src/HttpRequest.cpp b/src/HttpRequest.cpp index 1b83408..2eb2db8 100644 --- a/src/HttpRequest.cpp +++ b/src/HttpRequest.cpp @@ -2,7 +2,7 @@ // Created by fred on 10/12/16. // -#include "HttpRequest.h" +#include "frnetlib/HttpRequest.h" namespace fr { diff --git a/src/HttpResponse.cpp b/src/HttpResponse.cpp index 0db26a5..a5f1d71 100644 --- a/src/HttpResponse.cpp +++ b/src/HttpResponse.cpp @@ -3,7 +3,7 @@ // #include -#include "HttpResponse.h" +#include "frnetlib/HttpResponse.h" namespace fr { @@ -70,7 +70,7 @@ namespace fr //Add in required headers if they're missing if(headers.find("Connection") == headers.end()) - response += "Connection: close\r\n"; + response += "Connection: close_socket\r\n"; if(headers.find("Content-type") == headers.end()) response += "Content-type: text/html\r\n"; diff --git a/src/HttpSocket.cpp b/src/HttpSocket.cpp index 62375dd..609745f 100644 --- a/src/HttpSocket.cpp +++ b/src/HttpSocket.cpp @@ -2,8 +2,8 @@ // Created by fred on 10/12/16. // -#include -#include "HttpSocket.h" +#include +#include "frnetlib/HttpSocket.h" namespace fr { diff --git a/src/Packet.cpp b/src/Packet.cpp index 64a1168..5b480c6 100644 --- a/src/Packet.cpp +++ b/src/Packet.cpp @@ -2,7 +2,7 @@ // Created by fred on 06/12/16. // -#include "Packet.h" +#include "frnetlib/Packet.h" namespace fr { diff --git a/src/SSLListener.cpp b/src/SSLListener.cpp index 1248ca0..b1a8e89 100644 --- a/src/SSLListener.cpp +++ b/src/SSLListener.cpp @@ -3,7 +3,7 @@ // #include -#include "SSLListener.h" +#include "frnetlib/SSLListener.h" #ifdef SSL_ENABLED namespace fr diff --git a/src/SSLSocket.cpp b/src/SSLSocket.cpp index ea10050..28980bf 100644 --- a/src/SSLSocket.cpp +++ b/src/SSLSocket.cpp @@ -2,7 +2,7 @@ // Created by fred on 12/12/16. // -#include "SSLSocket.h" +#include "frnetlib/SSLSocket.h" #include #ifdef SSL_ENABLED @@ -20,13 +20,13 @@ namespace fr SSLSocket::~SSLSocket() noexcept { //Close connection if active - close(); + close_socket(); //Cleanup mbedsql stuff mbedtls_ssl_config_free(&conf); } - void SSLSocket::close() + void SSLSocket::close_socket() { if(is_connected) { diff --git a/src/Socket.cpp b/src/Socket.cpp index ed7a063..379a742 100644 --- a/src/Socket.cpp +++ b/src/Socket.cpp @@ -2,16 +2,31 @@ // Created by fred on 06/12/16. // -#include "Socket.h" +#include "frnetlib/Socket.h" namespace fr { + #ifdef _WIN32 + WSADATA Socket::wsaData = WSADATA(); + uint32_t Socket::instance_count = 0; + #endif // _WIN32 Socket::Socket() noexcept : is_blocking(true), is_connected(false) { - + #ifdef _WIN32 + if(instance_count == 0) + { + int wsa_result = WSAStartup(MAKEWORD(2, 2), &wsaData); + if(wsa_result != 0) + { + std::cout << "Failed to initialise WSA." << std::endl; + return; + } + } + instance_count++; + #endif // _WIN32 } Socket::Status Socket::send(const Packet &packet) diff --git a/src/SocketSelector.cpp b/src/SocketSelector.cpp index afd8d1f..de12a8d 100644 --- a/src/SocketSelector.cpp +++ b/src/SocketSelector.cpp @@ -2,7 +2,7 @@ // Created by fred on 09/12/16. // -#include "SocketSelector.h" +#include "frnetlib/SocketSelector.h" namespace fr { diff --git a/src/TcpListener.cpp b/src/TcpListener.cpp index 2afc037..e299777 100644 --- a/src/TcpListener.cpp +++ b/src/TcpListener.cpp @@ -2,7 +2,7 @@ // Created by fred on 06/12/16. // -#include "TcpListener.h" +#include "frnetlib/TcpListener.h" namespace fr { diff --git a/src/TcpSocket.cpp b/src/TcpSocket.cpp index ce8ab37..f483e70 100644 --- a/src/TcpSocket.cpp +++ b/src/TcpSocket.cpp @@ -3,7 +3,7 @@ // #include -#include "TcpSocket.h" +#include "frnetlib/TcpSocket.h" namespace fr { @@ -16,7 +16,7 @@ namespace fr TcpSocket::~TcpSocket() noexcept { - close(); + close_socket(); } Socket::Status TcpSocket::send_raw(const char *data, size_t size) @@ -43,11 +43,11 @@ namespace fr return Socket::Status::Success; } - void TcpSocket::close() + void TcpSocket::close_socket() { if(is_connected) { - ::close(socket_descriptor); + ::closesocket(socket_descriptor); is_connected = false; } }