From 28e686c507c5a95fdd1c2ed94dbe9d5d3cd3d2cc Mon Sep 17 00:00:00 2001 From: Greg Date: Tue, 27 Dec 2022 18:24:09 -0700 Subject: [PATCH] Create socket classes for socket helper methods for better organization. --- Playstation/OrbisLibAPI/Apps.cpp | 38 ++-- Playstation/OrbisLibAPI/Common.h | 3 +- Playstation/OrbisLibAPI/GeneralIPC.cpp | 4 +- Playstation/OrbisLibAPI/OrbisLibAPI.vcxproj | 2 + .../OrbisLibAPI/OrbisLibAPI.vcxproj.filters | 6 + Playstation/OrbisLibAPI/Proc.cpp | 2 +- Playstation/OrbisLibAPI/ShellUIIPC.cpp | 4 +- Playstation/OrbisLibAPI/Sockets.cpp | 36 ++++ Playstation/OrbisLibAPI/Sockets.h | 12 ++ Playstation/OrbisLibAPI/Utilities.cpp | 40 ----- Playstation/OrbisLibAPI/Utilities.h | 6 - Playstation/OrbisLibAPI/Version.h | 22 +-- Playstation/OrbisLibAPI/main.cpp | 2 +- Playstation/OrbisToolbox-2.0/Version.h | 22 +-- .../OrbisLib2/Common/Helpers/Helper.cs | 150 ---------------- .../OrbisLib2/Common/Helpers/Sockets.cs | 164 ++++++++++++++++++ .../Resources/BuildNumber.txt | 2 +- .../Resources/BuildString.txt | 2 +- .../Service/TargetWatcher.cs | 6 +- 19 files changed, 274 insertions(+), 249 deletions(-) create mode 100644 Playstation/OrbisLibAPI/Sockets.cpp create mode 100644 Playstation/OrbisLibAPI/Sockets.h create mode 100644 Windows/Libraries/OrbisLib2/Common/Helpers/Sockets.cs diff --git a/Playstation/OrbisLibAPI/Apps.cpp b/Playstation/OrbisLibAPI/Apps.cpp index 0a49964..9027143 100644 --- a/Playstation/OrbisLibAPI/Apps.cpp +++ b/Playstation/OrbisLibAPI/Apps.cpp @@ -89,13 +89,13 @@ void Apps::GetAppsList(OrbisNetId Sock) std::vector AppList; if (!AppDatabase::GetApps(AppList)) { - SockSendInt(Sock, 0); + Sockets::SendInt(Sock, 0); return; } - SockSendInt(Sock, AppList.size()); + Sockets::SendInt(Sock, AppList.size()); - SendLargeData(Sock, (unsigned char*)AppList.data(), AppList.size() * sizeof(AppInfoPacket)); + Sockets::SendLargeData(Sock, (unsigned char*)AppList.data(), AppList.size() * sizeof(AppInfoPacket)); } void Apps::GetAppInfoString(OrbisNetId Sock, const char* TitleId) @@ -147,7 +147,7 @@ void Apps::SendAppStatus(OrbisNetId Sock, const char* TitleId) // If we have no appId that means the process is not running. if (appId <= 0) { - SockSendInt(Sock, STATE_NOT_RUNNING); + Sockets::SendInt(Sock, STATE_NOT_RUNNING); } else { @@ -155,11 +155,11 @@ void Apps::SendAppStatus(OrbisNetId Sock, const char* TitleId) auto res = sceSystemServiceIsAppSuspended(appId, &state); if (res == 0 && state) { - SockSendInt(Sock, STATE_SUSPENDED); + Sockets::SendInt(Sock, STATE_SUSPENDED); } else { - SockSendInt(Sock, STATE_RUNNING); + Sockets::SendInt(Sock, STATE_RUNNING); } } } @@ -173,7 +173,7 @@ void Apps::StartApp(OrbisNetId Sock, const char* TitleId) { klog("sceUserServiceGetForegroundUser(): Failed with error %llX\n", res); - SockSendInt(Sock, 0); + Sockets::SendInt(Sock, 0); return; } @@ -182,11 +182,11 @@ void Apps::StartApp(OrbisNetId Sock, const char* TitleId) { klog("sceLncUtilLaunchApp() : Failed with error % llX\n", res); - SockSendInt(Sock, 0); + Sockets::SendInt(Sock, 0); return; } - SockSendInt(Sock, res); + Sockets::SendInt(Sock, res); } void Apps::KillApp(OrbisNetId Sock, const char* TitleId) @@ -195,11 +195,11 @@ void Apps::KillApp(OrbisNetId Sock, const char* TitleId) if (appId > 0 && sceSystemServiceKillApp(appId, -1, 0, 0) == 0) { - SockSendInt(Sock, 1); + Sockets::SendInt(Sock, 1); } else { - SockSendInt(Sock, 0); + Sockets::SendInt(Sock, 0); } } @@ -209,11 +209,11 @@ void Apps::SuspendApp(OrbisNetId Sock, const char* TitleId) if (appId > 0 && LncUtil::sceLncUtilSuspendApp(appId, 0) == 0) { - SockSendInt(Sock, 1); + Sockets::SendInt(Sock, 1); } else { - SockSendInt(Sock, 0); + Sockets::SendInt(Sock, 0); } } @@ -223,11 +223,11 @@ void Apps::ResumeApp(OrbisNetId Sock, const char* TitleId) if (appId > 0 && LncUtil::sceLncUtilResumeApp(appId, 0) == 0 && sceApplicationSetApplicationFocus(appId) == 0) { - SockSendInt(Sock, 1); + Sockets::SendInt(Sock, 1); } else { - SockSendInt(Sock, 0); + Sockets::SendInt(Sock, 0); } } @@ -235,7 +235,7 @@ void Apps::DeleteApp(OrbisNetId Sock, const char* TitleId) { auto result = sceAppInstUtilAppUnInstall(TitleId); - SockSendInt(Sock, (result == 0) ? 1 : 0); + Sockets::SendInt(Sock, (result == 0) ? 1 : 0); } void Apps::SetVisibility(OrbisNetId Sock, const char* TitleId) @@ -248,16 +248,16 @@ void Apps::SetVisibility(OrbisNetId Sock, const char* TitleId) ShellUIIPC::RefreshContentArea(); - SockSendInt(Sock, result ? 1 : 0); + Sockets::SendInt(Sock, result ? 1 : 0); } - SockSendInt(Sock, 0); + Sockets::SendInt(Sock, 0); } void Apps::GetVisibility(OrbisNetId Sock, const char* TitleId) { auto visibility = AppDatabase::GetVisibility(TitleId); - SockSendInt(Sock, visibility); + Sockets::SendInt(Sock, visibility); } Apps::Apps() diff --git a/Playstation/OrbisLibAPI/Common.h b/Playstation/OrbisLibAPI/Common.h index d527ff2..ebf9464 100644 --- a/Playstation/OrbisLibAPI/Common.h +++ b/Playstation/OrbisLibAPI/Common.h @@ -28,10 +28,11 @@ #include "Utilities.h" #include "GoldHEN.h" #include "../../Misc/libjbc.h" +#include "Sockets.h" #include "System.h" #include "Flash.h" #include "APIPackets.h" #include "LncUtil.h" #include "ShellCoreUtil.h" -#include "SystemMonitor.h" \ No newline at end of file +#include "SystemMonitor.h" diff --git a/Playstation/OrbisLibAPI/GeneralIPC.cpp b/Playstation/OrbisLibAPI/GeneralIPC.cpp index 734ede6..6e16eda 100644 --- a/Playstation/OrbisLibAPI/GeneralIPC.cpp +++ b/Playstation/OrbisLibAPI/GeneralIPC.cpp @@ -26,14 +26,14 @@ OrbisNetId GeneralIPC::Connect(const char* ProcessName) bool GeneralIPC::SendCommand(OrbisNetId Sock, int Command) { - if (!SockSendInt(Sock, Command)) + if (!Sockets::SendInt(Sock, Command)) { klog("[GeneralIPC] Failed to send Command\n"); return false; } int Status; - if (!SockRecvInt(Sock, &Status)) + if (!Sockets::RecvInt(Sock, &Status)) { klog("[GeneralIPC] Failed to recv status\n"); return false; diff --git a/Playstation/OrbisLibAPI/OrbisLibAPI.vcxproj b/Playstation/OrbisLibAPI/OrbisLibAPI.vcxproj index 041b2ff..b19a6fa 100644 --- a/Playstation/OrbisLibAPI/OrbisLibAPI.vcxproj +++ b/Playstation/OrbisLibAPI/OrbisLibAPI.vcxproj @@ -76,6 +76,7 @@ del /s /q /f $(IntDir)\*.oelf + @@ -99,6 +100,7 @@ del /s /q /f $(IntDir)\*.oelf + diff --git a/Playstation/OrbisLibAPI/OrbisLibAPI.vcxproj.filters b/Playstation/OrbisLibAPI/OrbisLibAPI.vcxproj.filters index 87a2366..7a958e6 100644 --- a/Playstation/OrbisLibAPI/OrbisLibAPI.vcxproj.filters +++ b/Playstation/OrbisLibAPI/OrbisLibAPI.vcxproj.filters @@ -106,6 +106,9 @@ Source Files\Utilities + + Source Files\Utilities + @@ -174,5 +177,8 @@ Header Files\Utilities + + Header Files\Utilities + \ No newline at end of file diff --git a/Playstation/OrbisLibAPI/Proc.cpp b/Playstation/OrbisLibAPI/Proc.cpp index 712b715..541e197 100644 --- a/Playstation/OrbisLibAPI/Proc.cpp +++ b/Playstation/OrbisLibAPI/Proc.cpp @@ -44,7 +44,7 @@ void Proc::SendProcessList(OrbisNetId Sock) std::vector processList; GetProcessList(processList); - SockSendInt(Sock, processList.size()); + Sockets::SendInt(Sock, processList.size()); for (const auto& i : processList) { diff --git a/Playstation/OrbisLibAPI/ShellUIIPC.cpp b/Playstation/OrbisLibAPI/ShellUIIPC.cpp index d13bcf3..f81421a 100644 --- a/Playstation/OrbisLibAPI/ShellUIIPC.cpp +++ b/Playstation/OrbisLibAPI/ShellUIIPC.cpp @@ -23,14 +23,14 @@ OrbisNetId ShellUIIPC::Connect() bool ShellUIIPC::SendCommand(OrbisNetId Sock, int Command) { - if (!SockSendInt(Sock, Command)) + if (!Sockets::SendInt(Sock, Command)) { klog("[GeneralIPC] Failed to send Command\n"); return false; } int Status; - if (!SockRecvInt(Sock, &Status)) + if (!Sockets::RecvInt(Sock, &Status)) { klog("[GeneralIPC] Failed to recv status\n"); return false; diff --git a/Playstation/OrbisLibAPI/Sockets.cpp b/Playstation/OrbisLibAPI/Sockets.cpp new file mode 100644 index 0000000..dcc920d --- /dev/null +++ b/Playstation/OrbisLibAPI/Sockets.cpp @@ -0,0 +1,36 @@ +#include "Common.h" +#include "Sockets.h" + +bool Sockets::SendInt(OrbisNetId Sock, int val) +{ + return !(sceNetSend(Sock, &val, sizeof(int), 0) < 0); +} + +bool Sockets::RecvInt(OrbisNetId Sock, int* val) +{ + return !(sceNetRecv(Sock, val, sizeof(int), 0) < 0); +} + +bool Sockets::SendLargeData(OrbisNetId Sock, unsigned char* data, size_t dataLen) +{ + unsigned char* CurrentPosition = data; + size_t DataLeft = dataLen; + int res = 0; + + while (DataLeft > 0) + { + size_t DataChunkSize = std::min((size_t)8192, DataLeft); + + res = sceNetSend(Sock, CurrentPosition, DataChunkSize, 0); + + if (res < 0) + { + return false; + } + + DataLeft -= res; + CurrentPosition += res; + } + + return true; +} \ No newline at end of file diff --git a/Playstation/OrbisLibAPI/Sockets.h b/Playstation/OrbisLibAPI/Sockets.h new file mode 100644 index 0000000..d31075d --- /dev/null +++ b/Playstation/OrbisLibAPI/Sockets.h @@ -0,0 +1,12 @@ +#pragma once + +class Sockets +{ +public: + static bool SendInt(OrbisNetId Sock, int val); + static bool RecvInt(OrbisNetId Sock, int* val); + static bool SendLargeData(OrbisNetId Sock, unsigned char* data, size_t dataLen); + +private: + +}; diff --git a/Playstation/OrbisLibAPI/Utilities.cpp b/Playstation/OrbisLibAPI/Utilities.cpp index e01b496..2c3e00e 100644 --- a/Playstation/OrbisLibAPI/Utilities.cpp +++ b/Playstation/OrbisLibAPI/Utilities.cpp @@ -190,46 +190,6 @@ int getMacAddress(OrbisNetIfName ifName_Num, char* strOut, size_t len) #pragma endregion -#pragma region Networking - -bool SockSendInt(OrbisNetId Sock, int val) -{ - return !(sceNetSend(Sock, &val, sizeof(int), 0) < 0); -} - -bool SockRecvInt(OrbisNetId Sock, int* val) -{ - return !(sceNetRecv(Sock, val, sizeof(int), 0) < 0); -} - -#define MIN(a,b) ((a) < (b) ? (a) : (b)) - -bool SendLargeData(OrbisNetId Sock, unsigned char* data, size_t dataLen) -{ - unsigned char* CurrentPosition = data; - size_t DataLeft = dataLen; - int res = 0; - - while (DataLeft > 0) - { - size_t DataChunkSize = MIN(8192, DataLeft); - - res = sceNetSend(Sock, CurrentPosition, DataChunkSize, 0); - - if (res < 0) - { - return false; - } - - DataLeft -= res; - CurrentPosition += res; - } - - return true; -} - -#pragma endregion - void hexdump(void* ptr, int buflen) { unsigned char* buf = (unsigned char*)ptr; int i, j; diff --git a/Playstation/OrbisLibAPI/Utilities.h b/Playstation/OrbisLibAPI/Utilities.h index 93e6918..c1e4b0e 100644 --- a/Playstation/OrbisLibAPI/Utilities.h +++ b/Playstation/OrbisLibAPI/Utilities.h @@ -15,12 +15,6 @@ bool Jailbreak(); bool CopySflash(); int getMacAddress(OrbisNetIfName ifName_Num, char* strOut, size_t strlen); -//TODO: Make socket class. -// Networking -bool SockSendInt(OrbisNetId Sock, int val); -bool SockRecvInt(OrbisNetId Sock, int* val); -bool SendLargeData(OrbisNetId Sock, unsigned char* data, size_t dataLen); - struct kinfo_proc { int structSize; //0x00 int layout; //0x04 diff --git a/Playstation/OrbisLibAPI/Version.h b/Playstation/OrbisLibAPI/Version.h index fea2b21..5ef05b4 100644 --- a/Playstation/OrbisLibAPI/Version.h +++ b/Playstation/OrbisLibAPI/Version.h @@ -1,11 +1,11 @@ -#pragma once -#define ORBISLIB_MAJOR 3 -#define ORBISLIB_MINOR 0 -#define ORBISLIB_BUILDVERSION 708 -#define stringify(a) stringify_(a) -#define stringify_(a) #a -#if defined(_DEBUG) -#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Dev Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__) -#else -#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__) -#endif +#pragma once +#define ORBISLIB_MAJOR 3 +#define ORBISLIB_MINOR 0 +#define ORBISLIB_BUILDVERSION 715 +#define stringify(a) stringify_(a) +#define stringify_(a) #a +#if defined(_DEBUG) +#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Dev Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__) +#else +#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__) +#endif diff --git a/Playstation/OrbisLibAPI/main.cpp b/Playstation/OrbisLibAPI/main.cpp index 0ab3da1..1a4761e 100644 --- a/Playstation/OrbisLibAPI/main.cpp +++ b/Playstation/OrbisLibAPI/main.cpp @@ -84,7 +84,7 @@ int main() // Init App install utils. sceAppInstUtilInitialize(); -//#define LOADTOOLBOX +#define LOADTOOLBOX #ifdef LOADTOOLBOX auto handle = sys_sdk_proc_prx_load("SceShellUI", "/user/data/Orbis Toolbox/OrbisToolbox-2.0.sprx"); if (handle > 0) { diff --git a/Playstation/OrbisToolbox-2.0/Version.h b/Playstation/OrbisToolbox-2.0/Version.h index 4b64c37..fce93fa 100644 --- a/Playstation/OrbisToolbox-2.0/Version.h +++ b/Playstation/OrbisToolbox-2.0/Version.h @@ -1,11 +1,11 @@ -#pragma once -#define ORBIS_TOOLBOX_MAJOR 2 -#define ORBIS_TOOLBOX_MINOR 0 -#define ORBIS_TOOLBOX_BUILDVERSION 290 -#define stringify(a) stringify_(a) -#define stringify_(a) #a -#if defined(ORBIS_TOOLBOX_DEBUG) -#define ORBIS_TOOLBOX_BUILDSTRING ("[Orbis Toolbox " stringify(ORBIS_TOOLBOX_MAJOR) "." stringify(ORBIS_TOOLBOX_MINOR) "] Dev Build " stringify(ORBIS_TOOLBOX_BUILDVERSION) " " __DATE__ " " __TIME__) -#else -#define ORBIS_TOOLBOX_BUILDSTRING ("[Orbis Toolbox " stringify(ORBIS_TOOLBOX_MAJOR) "." stringify(ORBIS_TOOLBOX_MINOR) "] Build " stringify(ORBIS_TOOLBOX_BUILDVERSION) " " __DATE__ " " __TIME__) -#endif +#pragma once +#define ORBIS_TOOLBOX_MAJOR 2 +#define ORBIS_TOOLBOX_MINOR 0 +#define ORBIS_TOOLBOX_BUILDVERSION 291 +#define stringify(a) stringify_(a) +#define stringify_(a) #a +#if defined(ORBIS_TOOLBOX_DEBUG) +#define ORBIS_TOOLBOX_BUILDSTRING ("[Orbis Toolbox " stringify(ORBIS_TOOLBOX_MAJOR) "." stringify(ORBIS_TOOLBOX_MINOR) "] Dev Build " stringify(ORBIS_TOOLBOX_BUILDVERSION) " " __DATE__ " " __TIME__) +#else +#define ORBIS_TOOLBOX_BUILDSTRING ("[Orbis Toolbox " stringify(ORBIS_TOOLBOX_MAJOR) "." stringify(ORBIS_TOOLBOX_MINOR) "] Build " stringify(ORBIS_TOOLBOX_BUILDVERSION) " " __DATE__ " " __TIME__) +#endif diff --git a/Windows/Libraries/OrbisLib2/Common/Helpers/Helper.cs b/Windows/Libraries/OrbisLib2/Common/Helpers/Helper.cs index 67864d4..cbb510f 100644 --- a/Windows/Libraries/OrbisLib2/Common/Helpers/Helper.cs +++ b/Windows/Libraries/OrbisLib2/Common/Helpers/Helper.cs @@ -41,156 +41,6 @@ namespace OrbisLib2.Common.Helpers } } - /// - /// Sends an object and its size to the socket. - /// - /// - /// The object we would like to send. (Must be serializable.) - public static void SendObject(this Socket s, object obj) - { - var Data = ObjectToByteArray(obj); - s.Send(BitConverter.GetBytes(Data.Length), sizeof(int), SocketFlags.None); - s.Send(Data); - } - - /// - /// Recieve an object from a socket. - /// - /// - /// Returns the object we would like to receive. - public static object RecvObject(this Socket s) - { - var ObjectSize = s.RecvInt32(); - - var ObjectData = new byte[ObjectSize]; - s.Receive(ObjectData); - - return ByteArrayToObject(ObjectData); - } - - /// - /// Sends an int32 over socket. - /// - /// - /// - public static void SendInt32(this Socket s, int Data) - { - s.Send(BitConverter.GetBytes(Data)); - } - - - /// - /// Receives an int32 over sockets. - /// - /// - /// - public static int RecvInt32(this Socket s) - { - var Data = new byte[sizeof(int)]; - s.Receive(Data); - return BitConverter.ToInt32(Data, 0); - } - - public static void RecvLarge(this Socket s, byte[] data) - { - int Left = data.Length; - int Received = 0; - - while(Left > 0) - { - var chunkSize = Math.Min(s.ReceiveBufferSize, Left); - var res = s.Receive(data, Received, chunkSize, 0); - - Received += res; - Left -= res; - } - } - - /// - /// Easily connect to a socket and handle the time out. - /// - /// - /// The address we would like to connect to. - /// The port of the socket we would like to connect to. - /// The time we would like to wait for connection. - /// - public static bool EasyConnect(this Socket s, string IPAddress, int Port, int TimeOut) - { - s.ReceiveTimeout = s.SendTimeout = TimeOut * 1000; - var result = s.BeginConnect(IPAddress, Port, null, null); - - result.AsyncWaitHandle.WaitOne(3000, true); - - if (!s.Connected) - { - Console.WriteLine("Failed to connect to socket."); - - s.Close(); - return false; - } - - // we have connected - s.EndConnect(result); - - return true; - } - - /// - /// Tests the availability of a tcp host. - /// - /// Host Address. - /// Host Port. - /// - public static bool TestTcpConnection(string Host, int Port) - { - try - { - var client = new TcpClient(); - var result = client.BeginConnect(Host, Port, null, null); - - var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1)); - - if (!success) - { - return false; - } - - client.EndConnect(result); - - return true; - } - catch - { - - } - - return false; - } - - /// - /// Attempts to ping a host. - /// - /// Host Address - /// - public static bool PingHost(string Host) - { - try - { - var pingSender = new Ping(); - var options = new PingOptions(); - options.DontFragment = true; - - var reply = pingSender.Send(Host, 120, Encoding.ASCII.GetBytes("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), options); - return (reply.Status == IPStatus.Success); - } - catch - { - - } - - return false; - } - /// /// /// diff --git a/Windows/Libraries/OrbisLib2/Common/Helpers/Sockets.cs b/Windows/Libraries/OrbisLib2/Common/Helpers/Sockets.cs new file mode 100644 index 0000000..2f3a884 --- /dev/null +++ b/Windows/Libraries/OrbisLib2/Common/Helpers/Sockets.cs @@ -0,0 +1,164 @@ +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Text; + +namespace OrbisLib2.Common.Helpers +{ + public static class Sockets + { + /// + /// Recieve large amounts of data from a socket that is larger than the recieve buffer size. + /// + /// The current socket. + /// The data to be recieved. + public static void RecvLarge(this Socket s, byte[] data) + { + int Left = data.Length; + int Received = 0; + + while (Left > 0) + { + var chunkSize = Math.Min(s.ReceiveBufferSize, Left); + var res = s.Receive(data, Received, chunkSize, 0); + + Received += res; + Left -= res; + } + } + + /// + /// Sends an object and its size to the socket. + /// + /// + /// The object we would like to send. (Must be serializable.) + public static void SendObject(this Socket s, object obj) + { + var Data = Helper.ObjectToByteArray(obj); + s.Send(BitConverter.GetBytes(Data.Length), sizeof(int), SocketFlags.None); + s.Send(Data); + } + + /// + /// Recieve an object from a socket. + /// + /// + /// Returns the object we would like to receive. + public static object RecvObject(this Socket s) + { + var ObjectSize = s.RecvInt32(); + + var ObjectData = new byte[ObjectSize]; + s.Receive(ObjectData); + + return Helper.ByteArrayToObject(ObjectData); + } + + /// + /// Sends an int32 over socket. + /// + /// + /// + public static void SendInt32(this Socket s, int Data) + { + s.Send(BitConverter.GetBytes(Data)); + } + + + /// + /// Receives an int32 over sockets. + /// + /// + /// + public static int RecvInt32(this Socket s) + { + var Data = new byte[sizeof(int)]; + s.Receive(Data); + return BitConverter.ToInt32(Data, 0); + } + + /// + /// Attempts to ping a host. + /// + /// Host Address + /// + public static bool PingHost(string Host) + { + try + { + var pingSender = new Ping(); + var options = new PingOptions(); + options.DontFragment = true; + + var reply = pingSender.Send(Host, 120, Encoding.ASCII.GetBytes("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), options); + return (reply.Status == IPStatus.Success); + } + catch + { + + } + + return false; + } + + /// + /// Tests the availability of a tcp host. + /// + /// Host Address. + /// Host Port. + /// + public static bool TestTcpConnection(string Host, int Port) + { + try + { + var client = new TcpClient(); + var result = client.BeginConnect(Host, Port, null, null); + + var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1)); + + if (!success) + { + return false; + } + + client.EndConnect(result); + + return true; + } + catch + { + + } + + return false; + } + + /// + /// Easily connect to a socket and handle the time out. + /// + /// + /// The address we would like to connect to. + /// The port of the socket we would like to connect to. + /// The time we would like to wait for connection. + /// + public static bool EasyConnect(this Socket s, string IPAddress, int Port, int TimeOut) + { + s.ReceiveTimeout = s.SendTimeout = TimeOut * 1000; + var result = s.BeginConnect(IPAddress, Port, null, null); + + result.AsyncWaitHandle.WaitOne(3000, true); + + if (!s.Connected) + { + Console.WriteLine("Failed to connect to socket."); + + s.Close(); + return false; + } + + // we have connected + s.EndConnect(result); + + return true; + } + } +} diff --git a/Windows/OrbisNeighborHood/Resources/BuildNumber.txt b/Windows/OrbisNeighborHood/Resources/BuildNumber.txt index 0b460a9..1905eb8 100644 --- a/Windows/OrbisNeighborHood/Resources/BuildNumber.txt +++ b/Windows/OrbisNeighborHood/Resources/BuildNumber.txt @@ -1 +1 @@ -2161 +2163 diff --git a/Windows/OrbisNeighborHood/Resources/BuildString.txt b/Windows/OrbisNeighborHood/Resources/BuildString.txt index d5b5301..ca66626 100644 --- a/Windows/OrbisNeighborHood/Resources/BuildString.txt +++ b/Windows/OrbisNeighborHood/Resources/BuildString.txt @@ -1 +1 @@ -Version 3.0.2161 Debug Build Saturday December 24 2022 11:40 AM +Version 3.0.2163 Debug Build Tuesday December 27 2022 5:28 PM diff --git a/Windows/OrbisSuiteService/Service/TargetWatcher.cs b/Windows/OrbisSuiteService/Service/TargetWatcher.cs index 0cf88b8..1705e59 100644 --- a/Windows/OrbisSuiteService/Service/TargetWatcher.cs +++ b/Windows/OrbisSuiteService/Service/TargetWatcher.cs @@ -30,14 +30,14 @@ namespace OrbisSuiteService.Service var oldAvailable = Target.Info.IsAvailable; var OldAPIAvailable = Target.Info.IsAPIAvailable; - if(Helper.PingHost(Target.IPAddress)) + if(Sockets.PingHost(Target.IPAddress)) { var detail = Target.Info; detail.IsAvailable = true; } - Target.Info.IsAvailable = Helper.PingHost(Target.IPAddress); - Target.Info.IsAPIAvailable = Helper.TestTcpConnection(Target.IPAddress, Settings.CreateInstance().APIPort); + Target.Info.IsAvailable = Sockets.PingHost(Target.IPAddress); + Target.Info.IsAPIAvailable = Sockets.TestTcpConnection(Target.IPAddress, Settings.CreateInstance().APIPort); Target.Info.Save(); if (Target.Info.IsAPIAvailable)