// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. #pragma once #include "Engine/Core/Types/BaseTypes.h" #include "Engine/Core/Types/String.h" API_INJECT_CPP_CODE("#include \"Engine/Platform/Network.h\""); #define SOCKGROUP_MAXCOUNT 64 #define SOCKGROUP_ITEMSIZE 16 enum class FLAXENGINE_API NetworkProtocolType { Undefined, Udp, Tcp }; enum class FLAXENGINE_API NetworkIPVersion { Undefined, IPv4, IPv6 }; struct FLAXENGINE_API NetworkSocket { NetworkProtocolType Protocol = NetworkProtocolType::Undefined; NetworkIPVersion IPVersion = NetworkIPVersion::Undefined; byte Data[8] = {}; // sizeof SOCKET = unsigned __int64 }; struct FLAXENGINE_API NetworkEndPoint { NetworkIPVersion IPVersion = NetworkIPVersion::Undefined; String Address; String Port; byte Data[28] = {}; // sizeof sockaddr_in6 , biggest sockaddr that we will use }; enum FLAXENGINE_API NetworkSocketOption { Debug, ReuseAddr, KeepAlive, DontRoute, Broadcast, UseLoopback, Linger, OOBInline, SendBuffer, RecvBuffer, SendTimeout, RecvTimeout, Error, NoDelay, IPv6Only }; struct FLAXENGINE_API NetworkSocketState { bool Error = false; bool Invalid = false; bool Disconnected = false; bool Readable = false; bool Writeable = false; }; struct FLAXENGINE_API NetworkSocketGroup { uint32 Count; byte Data[SOCKGROUP_MAXCOUNT * 16] = {}; }; class FLAXENGINE_API NetworkBase { public: /// /// Initialize the network module. /// /// Return true on error. Otherwise false. static bool Init(); /// /// Deinitialize the network module. /// static void Exit(); /// /// Create a new native socket. /// /// The socket struct to fill in. /// The protocol. /// The ip version. /// Return true on error. Otherwise false. static bool CreateSocket(NetworkSocket& socket, NetworkProtocolType proto, NetworkIPVersion ipv); /// /// Close native socket. /// /// The socket. /// Return true on error. Otherwise false. static bool DestroySocket(NetworkSocket& socket); /// /// Set the specified socket option. /// /// The socket. /// The option. /// The value. /// Return true on error. Otherwise false. static bool SetSocketOption(NetworkSocket& socket, NetworkSocketOption option, bool value); /// /// Set the specified socket option. /// /// The socket. /// The option. /// The value. /// Return true on error. Otherwise false. static bool SetSocketOption(NetworkSocket& socket, NetworkSocketOption option, int32 value); /// /// Get the specified socket option. /// /// The socket. /// The option. /// The returned value. /// Return true on error. Otherwise false. static bool GetSocketOption(NetworkSocket& socket, NetworkSocketOption option, bool* value); /// /// Get the specified socket option. /// /// The socket. /// The option. /// The returned value. /// Return true on error. Otherwise false. static bool GetSocketOption(NetworkSocket& socket, NetworkSocketOption option, int32* value); /// /// Connect a socket to the specified end point. /// /// The socket. /// The end point. /// Return true on error. Otherwise false. static bool ConnectSocket(NetworkSocket& socket, NetworkEndPoint& endPoint); /// /// Bind a socket to the specified end point. /// /// The socket. /// The end point. /// Return true on error. Otherwise false. static bool BindSocket(NetworkSocket& socket, NetworkEndPoint& endPoint); /// /// Listen for incoming connection. /// /// The socket. /// Pending connection queue size. /// Return true on error. Otherwise false. static bool Listen(NetworkSocket& socket, uint16 queueSize); /// /// Accept a pending connection. /// /// The socket. /// The newly connected socket. /// The end point of the new socket. /// Return true on error. Otherwise false. static bool Accept(NetworkSocket& serverSock, NetworkSocket& newSock, NetworkEndPoint& newEndPoint); static bool IsReadable(NetworkSocket& socket); static bool IsWriteable(NetworkSocket& socket); static int32 Poll(NetworkSocketGroup& group); static bool GetSocketState(NetworkSocketGroup& group, uint32 index, NetworkSocketState& state); static int32 AddSocketToGroup(NetworkSocketGroup& group, NetworkSocket& socket); static void ClearGroup(NetworkSocketGroup& group); static int32 WriteSocket(NetworkSocket socket, byte* data, uint32 length, NetworkEndPoint* endPoint = nullptr); static int32 ReadSocket(NetworkSocket socket, byte* buffer, uint32 bufferSize, NetworkEndPoint* endPoint = nullptr); static bool CreateEndPoint(String* address, String* port, NetworkIPVersion ipv, NetworkEndPoint& endPoint, bool bindable = false); static NetworkEndPoint RemapEndPointToIPv6(NetworkEndPoint& endPoint); };