diff --git a/TODO b/TODO new file mode 100644 index 0000000..d91ec20 --- /dev/null +++ b/TODO @@ -0,0 +1,2 @@ +initialization code for other operating systems - currently VoidNet only supports windows +initialization code for tcp client for other operating systems - " \ No newline at end of file diff --git a/VoidNet/VoidNet.sln b/VoidNet/VoidNet.sln deleted file mode 100644 index e1a04a4..0000000 --- a/VoidNet/VoidNet.sln +++ /dev/null @@ -1,28 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.24720.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VoidNet", "VoidNet\VoidNet.vcxproj", "{DC4D9247-92B6-4C52-B47C-41C34CF5D611}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DC4D9247-92B6-4C52-B47C-41C34CF5D611}.Debug|x64.ActiveCfg = Debug|x64 - {DC4D9247-92B6-4C52-B47C-41C34CF5D611}.Debug|x64.Build.0 = Debug|x64 - {DC4D9247-92B6-4C52-B47C-41C34CF5D611}.Debug|x86.ActiveCfg = Debug|Win32 - {DC4D9247-92B6-4C52-B47C-41C34CF5D611}.Debug|x86.Build.0 = Debug|Win32 - {DC4D9247-92B6-4C52-B47C-41C34CF5D611}.Release|x64.ActiveCfg = Release|x64 - {DC4D9247-92B6-4C52-B47C-41C34CF5D611}.Release|x64.Build.0 = Release|x64 - {DC4D9247-92B6-4C52-B47C-41C34CF5D611}.Release|x86.ActiveCfg = Release|Win32 - {DC4D9247-92B6-4C52-B47C-41C34CF5D611}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/VoidNet/VoidNet/VoidNet.vcxproj.filters b/VoidNet/VoidNet/VoidNet.vcxproj.filters deleted file mode 100644 index 9cd8510..0000000 --- a/VoidNet/VoidNet/VoidNet.vcxproj.filters +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/VoidNetVS/VoidNetVS.sln b/VoidNetVS/VoidNetVS.sln new file mode 100644 index 0000000..d18a210 --- /dev/null +++ b/VoidNetVS/VoidNetVS.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25123.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VoidNetVS", "VoidNetVS\VoidNetVS.vcxproj", "{5172321E-CCB0-4A77-9F3D-FAAF0084F434}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5172321E-CCB0-4A77-9F3D-FAAF0084F434}.Debug|x64.ActiveCfg = Debug|x64 + {5172321E-CCB0-4A77-9F3D-FAAF0084F434}.Debug|x64.Build.0 = Debug|x64 + {5172321E-CCB0-4A77-9F3D-FAAF0084F434}.Debug|x86.ActiveCfg = Debug|Win32 + {5172321E-CCB0-4A77-9F3D-FAAF0084F434}.Debug|x86.Build.0 = Debug|Win32 + {5172321E-CCB0-4A77-9F3D-FAAF0084F434}.Release|x64.ActiveCfg = Release|x64 + {5172321E-CCB0-4A77-9F3D-FAAF0084F434}.Release|x64.Build.0 = Release|x64 + {5172321E-CCB0-4A77-9F3D-FAAF0084F434}.Release|x86.ActiveCfg = Release|Win32 + {5172321E-CCB0-4A77-9F3D-FAAF0084F434}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/VoidNetVS/VoidNetVS/Debug/VoidNetVS.tlog/VoidNetVS.lastbuildstate b/VoidNetVS/VoidNetVS/Debug/VoidNetVS.tlog/VoidNetVS.lastbuildstate new file mode 100644 index 0000000..c34c192 --- /dev/null +++ b/VoidNetVS/VoidNetVS/Debug/VoidNetVS.tlog/VoidNetVS.lastbuildstate @@ -0,0 +1,2 @@ +#TargetFrameworkVersion=v4.0:PlatformToolSet=v140:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=8.1 +Debug|Win32|F:\VoidNet\VoidNetVS\| diff --git a/VoidNet/VoidNet/VoidNet.vcxproj b/VoidNetVS/VoidNetVS/VoidNetVS.vcxproj similarity index 79% rename from VoidNet/VoidNet/VoidNet.vcxproj rename to VoidNetVS/VoidNetVS/VoidNetVS.vcxproj index f57844b..ba417c9 100644 --- a/VoidNet/VoidNet/VoidNet.vcxproj +++ b/VoidNetVS/VoidNetVS/VoidNetVS.vcxproj @@ -18,14 +18,34 @@ x64 + + + + + + + + + + + + + + + + + + + + - {DC4D9247-92B6-4C52-B47C-41C34CF5D611} - VoidNet + {5172321E-CCB0-4A77-9F3D-FAAF0084F434} + VoidNetVS 8.1 - Application + StaticLibrary true v140 MultiByte @@ -74,6 +94,7 @@ Level3 Disabled true + F:\VoidNet\include @@ -90,14 +111,16 @@ true true true + AnySuitable + Speed + MultiThreaded + F:\VoidNet\include;F:\VoidNet\src true true + false - - ws2_32.lib;%(AdditionalDependencies) - diff --git a/VoidNetVS/VoidNetVS/VoidNetVS.vcxproj.filters b/VoidNetVS/VoidNetVS/VoidNetVS.vcxproj.filters new file mode 100644 index 0000000..13b2038 --- /dev/null +++ b/VoidNetVS/VoidNetVS/VoidNetVS.vcxproj.filters @@ -0,0 +1,57 @@ + + + + + {a0077c03-a272-4e35-99ef-6011b4489da3} + + + {4c99f44e-3ff9-4d5c-a3a1-27d1f02b0b7f} + + + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + + + src + + + src + + + src + + + src + + + src + + + src + + + + + + \ No newline at end of file diff --git a/include/Config.hpp b/include/Config.hpp new file mode 100644 index 0000000..5e6c3a7 --- /dev/null +++ b/include/Config.hpp @@ -0,0 +1,17 @@ +#ifndef CONFIG_HPP +#define CONFIG_HPP + +#ifdef _MSC_VER +#pragma once +#endif + +struct Config +{ + static void SetUsingConsole(bool value); + static bool GetUsingConsole(); + +private: + static bool using_console; +}; + +#endif \ No newline at end of file diff --git a/include/Defs.hpp b/include/Defs.hpp new file mode 100644 index 0000000..ac3de2d --- /dev/null +++ b/include/Defs.hpp @@ -0,0 +1,188 @@ +#ifndef DEFS_HPP +#define DEFS_HPP + +#ifdef _MSC_VER + #pragma once +#endif + +#ifdef _MSC_VER +#define WIN32_LEAN_AND_MEAN +#define _WINSOCKAPI_ +#include +#include +#include + +#pragma comment(lib, "ws2_32.lib") + +WSADATA wsa_data; + +typedef signed char int8, sbyte; +typedef unsigned char uint8, byte; +typedef signed short int16; +typedef unsigned short uint16; +typedef signed int int32; +typedef unsigned int uint32; +typedef signed __int64 int64; +typedef unsigned __int64 uint64; + +#ifdef _WIN64 +typedef signed __int64 int_ptr; +typedef unsigned __int64 uint_ptr; +#else +typedef signed long int_ptr; +typedef unsigned long uint_ptr; +#endif // win64 + +#elif defined(__GNUC__) || defined(__clang__) +typedef signed char int8, sbyte; +typedef unsigned char uint8, byte; +typedef signed short int16; +typedef unsigned short uint16; +typedef signed int int32; +typedef unsigned int uint32; + +#ifdef _WIN64 +typedef signed long long int_ptr, int64; +typedef unsigned long long uint_ptr, uint64; +#else +typedef signed long int_ptr; +typedef unsigned long uint_ptr; + +#ifdef __LP64__ +typedef signed long int64; +typedef unsigned long uint64; +#else +typedef signed long long int64; +typedef unsigned long long uint64; +#endif // __LP64__ + +#endif // win64 + +#elif defined(__DECCXX) + +typedef signed char int8, sbyte; +typedef unsigned char uint8, byte; +typedef signed short int16; +typedef unsigned short uint16; +typedef signed int int32; +typedef unsigned int uint32; +typedef signed __int64 int64; +typedef unsigned __int64 uint64; + +#ifdef __VMS +#ifdef __32BITS +typedef signed long int_ptr; +typedef unsigned long uint_ptr; +#else +typedef signed __int64 int_ptr; +typedef unsigned __int64 uint_ptr; +#endif // __32BITS +#else +typedef signed long int_ptr; +typedef unsigned long uint_ptr +#endif // __VMS + +#elif defined(__HP_aCC) + +typedef signed char int8, sbyte; +typedef unsigned char uint8, byte; +typedef signed short int16; +typedef unsigned short uint16; +typedef signed int int32; +typedef unsigned int uint32; +typedef signed long int_ptr; +typedef unsigned long uint_ptr; + +#ifdef __LP64__ +typedef signed long int64; +typedef unsigned long uint64; +#else +typedef signed long long int64; +typedef unsigned long long uint64; +#endif // __LP64__ + +#elif defined(__SUNPRO_CC) + +typedef signed char int8, sbyte; +typedef unsigned char uint8, byte; +typedef signed short int16; +typedef unsigned short uint16; +typedef signed int int32; +typedef unsigned int uint32; +typedef signed long int_ptr; +typedef unsigned long uint_otr + +#ifdef __sparcv9 +typedef signed long int64; +typedef unsigned long uint64; +#else +typedef signed long long int64; +typedef unsigned long long uint64; +#endif // __sparcv9 + +#elif defined(__IBMCPP__) + +typedef signed char int8, sbyte; +typedef unsigned char uint8, byte; +typedef signed short int16; +typedef unsigned short uint16; +typedef signed int int32; +typedef unsigned int uint32; +typedef signed long int_ptr; +typedef unsigned long uint_ptr; + +#ifdef __64BIT__ +typedef signed long int64; +typedef unsigned long uint64; +#else +typedef signed long long int64; +typedef unsigned long long uint64; +#endif // __64BIT__ + +#elif defined(__sgi) + +typedef signed char int8, sbyte; +typedef unsigned char uint8, byte; +typedef signed short int16; +typedef unsigned short uint16; +typedef signed int int32; +typedef unsigned int uint32; +typedef signed long int_ptr; +typedef unsigned long uint_ptr; + +#if _MIPS_SZLONG == 64 +typedef signed long int64; +typedef unsigned long uint64; +#else +typedef signed long long int64; +typedef unsigned long long uint64; +#endif // _MIPS_SZLONG + +#elif defined(_DIAB_TOOL) + +typedef signed char int8, sbyte; +typedef unsigned char uint8, byte; +typedef signed short int16; +typedef unsigned short uint16; +typedef signed int in32; +typedef unsigned int uint32; +typedef signed long int_ptr; +typedef unsigned long uint_ptr; +typedef signed long long int64; +typedef unsigned long long uint64; + +#endif // compiler data type defenitions + +const uint16 default_port = 60250; + +enum VoidCode +{ + VOID_SUCCESS, + VOID_WSA_INIT_FAILED, + VOID_TCP_INIT_FAILED, + VOID_INVALID_IP_ADDRESS, + VOID_INVALID_PORT, + VOID_COULDNT_CONNECT, +}; + +#endif // DEFS_HPP \ No newline at end of file diff --git a/include/Init.hpp b/include/Init.hpp new file mode 100644 index 0000000..5c0b3da --- /dev/null +++ b/include/Init.hpp @@ -0,0 +1,12 @@ +#ifndef INIT_HPP +#define INIT_HPP + +#ifdef _MSC_VER + #pragma once +#endif + +#include "Defs.hpp" + +VoidCode initialize(); + +#endif \ No newline at end of file diff --git a/include/NetworkMessage.hpp b/include/NetworkMessage.hpp new file mode 100644 index 0000000..57ebba5 --- /dev/null +++ b/include/NetworkMessage.hpp @@ -0,0 +1,16 @@ +#ifndef NETWORK_MESSAGE_HPP +#define NETWORK_MESSAGE_HPP + +#ifdef _MSC_VER +#pragma once +#endif + +class NetworkMessage +{ +public: + NetworkMessage(); + +private: +}; + +#endif \ No newline at end of file diff --git a/include/TcpClient.hpp b/include/TcpClient.hpp new file mode 100644 index 0000000..4a9ed6f --- /dev/null +++ b/include/TcpClient.hpp @@ -0,0 +1,47 @@ +#ifndef TCP_CLIENT_HPP +#define TCP_CLIENT_HPP + +#include "Defs.hpp" +#include "NetworkMessage.hpp" + +#include + +#ifdef _MSC_VER +#pragma once +#endif + +class TcpClient +{ +public: + TcpClient(); + TcpClient(const std::string &ip, uint16 port = default_port); + ~TcpClient(); + + const std::string &GetIP(); + void SetIP(const std::string &ip); + + uint16 GetPort(); + void SetPort(uint16 port); + + VoidCode Connect(); // this function is used if Initialize was not called + + char *ReceiveDataArray(); + const NetworkMessage &ReceiveData(); + bool SendData(const NetworkMessage &message); + +private: + VoidCode Initialize(const std::string &ip, uint16 port = default_port); + + std::string ip; + uint16 port = 0; + bool initialized; + +#ifdef _MSC_VER + SOCKET socket = INVALID_SOCKET; + struct addrinfo *result = nullptr; + struct addrinfo *ptr = nullptr; + struct addrinfo hints; +#endif +}; + +#endif \ No newline at end of file diff --git a/include/Utility.hpp b/include/Utility.hpp new file mode 100644 index 0000000..ac55726 --- /dev/null +++ b/include/Utility.hpp @@ -0,0 +1,14 @@ +#ifndef UTILITY_HPP +#define UTILITY_HPP + +#ifdef _MSC_VER +#pragma once +#endif + +struct Utility +{ + static void Delete(void *pointer); + static void DeleteArray(void *pointer); +}; + +#endif \ No newline at end of file diff --git a/include/VoidNet.hpp b/include/VoidNet.hpp new file mode 100644 index 0000000..ced8662 --- /dev/null +++ b/include/VoidNet.hpp @@ -0,0 +1,11 @@ +#ifndef VOID_NET_HPP +#define VOID_NET_HPP + +#ifdef _MSC_VER +#pragma once +#endif + +#include +#include + +#endif diff --git a/src/Config.cpp b/src/Config.cpp new file mode 100644 index 0000000..2d4dd36 --- /dev/null +++ b/src/Config.cpp @@ -0,0 +1,11 @@ +#include "Config.hpp" + +void Config::SetUsingConsole(bool value) +{ + using_console = value; +} + +bool Config::GetUsingConsole() +{ + return using_console; +} diff --git a/src/Init.cpp b/src/Init.cpp new file mode 100644 index 0000000..c022a35 --- /dev/null +++ b/src/Init.cpp @@ -0,0 +1,3 @@ +#ifdef _MSC_VER +#include "InitWindows.cpp" +#endif \ No newline at end of file diff --git a/src/InitWindows.cpp b/src/InitWindows.cpp new file mode 100644 index 0000000..69de6bf --- /dev/null +++ b/src/InitWindows.cpp @@ -0,0 +1,16 @@ +#include "Init.hpp" +#include "Config.hpp" + +#include + +VoidCode initialize() +{ + uint16 code = WSAStartup(MAKEWORD(2, 2), &wsa_data); + if (code != 0) + { + if (Config::GetUsingConsole()) + std::cerr << code << std::endl; // display some more information too + return VOID_WSA_INIT_FAILED; + } + return VOID_SUCCESS; +} \ No newline at end of file diff --git a/src/TcpClient.cpp b/src/TcpClient.cpp new file mode 100644 index 0000000..2b86fe3 --- /dev/null +++ b/src/TcpClient.cpp @@ -0,0 +1,3 @@ +#ifdef _MSC_VER +#include "TcpClientWindows.cpp" +#endif \ No newline at end of file diff --git a/src/TcpClientWindows.cpp b/src/TcpClientWindows.cpp new file mode 100644 index 0000000..7e9fc65 --- /dev/null +++ b/src/TcpClientWindows.cpp @@ -0,0 +1,122 @@ +#include "TcpClient.hpp" +#include "Utility.hpp" +#include "Config.hpp" + +#include + +VoidCode TcpClient::Initialize(const std::string &ip, uint16 port) +{ + if (ip.size() == 0 || std::count(ip.begin(), ip.end(), '.') != 4) + return VOID_INVALID_IP_ADDRESS; + if (port == 0) + return VOID_INVALID_PORT; + ZeroMemory(&hints, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + uint16 code = getaddrinfo(ip.c_str(), std::to_string(port).c_str(), &hints, &result); + if (code != 0) + { + if (Config::GetUsingConsole()) + std::cerr << code << std::endl; // display more info + WSACleanup(); + return VOID_TCP_INIT_FAILED; + } + + ptr = result; + socket = ::socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); + + if (socket == INVALID_SOCKET) + { + if (Config::GetUsingConsole()) + std::cerr << WSAGetLastError() << std::endl; // display more info + freeaddrinfo(result); + WSACleanup(); + return VOID_TCP_INIT_FAILED; + } + + initialized = true; + return VOID_SUCCESS; +} + +TcpClient::TcpClient() +{ +} + +TcpClient::TcpClient(const std::string &ip, uint16 port) : + ip(ip), port(port) +{ +} + +TcpClient::~TcpClient() +{ + freeaddrinfo(result); + WSACleanup(); + Utility::Delete(result); + Utility::Delete(ptr); +} + +const std::string & TcpClient::GetIP() +{ + return ip; +} + +void TcpClient::SetIP(const std::string & ip) +{ + this->ip = ip; +} + +uint16 TcpClient::GetPort() +{ + return port; +} + +void TcpClient::SetPort(uint16 port) +{ + this->port = port; +} + +VoidCode TcpClient::Connect() +{ + if (!initialized) + { + if (ip.size() == 0 || std::count(ip.begin(), ip.end(), '.') != 4) + return VOID_INVALID_IP_ADDRESS; + if (port == 0) + return VOID_INVALID_PORT; + VoidCode code = Initialize(ip, port); + if (code != VOID_SUCCESS) + return code; + } + uint16 connect_code = ::connect(socket, ptr->ai_addr, ptr->ai_addrlen); + if (connect_code == SOCKET_ERROR) + return VOID_COULDNT_CONNECT; +} + +char *TcpClient::ReceiveDataArray() +{ + char *header = new char[4](); + + int remote_buffer_size; + do + { + remote_buffer_size = recv(socket, header, 4, 0); + + if (WSAGetLastError() != 0) + { + // there was a problem receiving + } + } + while (remote_buffer_size > 0); +} + +const NetworkMessage &TcpClient::ReceiveData() +{ + +} + +bool TcpClient::SendData(const NetworkMessage &message) +{ + return false; +} diff --git a/src/Utility.cpp b/src/Utility.cpp new file mode 100644 index 0000000..dd56227 --- /dev/null +++ b/src/Utility.cpp @@ -0,0 +1,17 @@ +#include "Utility.hpp" + +void Utility::Delete(void *pointer) +{ + if (pointer == nullptr) + return; + delete pointer; + pointer = nullptr; +} + +void Utility::DeleteArray(void *pointer) +{ + if (pointer == nullptr) + return; + delete[] pointer; + pointer = nullptr; +} \ No newline at end of file