├── .gitignore ├── Config └── FilterPlugin.ini ├── LICENSE ├── README.md ├── Resources └── Icon128.png ├── Socketer.uplugin └── Source └── Socketer ├── Private ├── Socket.cpp ├── Socketer.cpp └── SocketerBPLibrary.cpp ├── Public ├── Socket.h ├── Socketer.h └── SocketerBPLibrary.h └── Socketer.Build.cs /.gitignore: -------------------------------------------------------------------------------- 1 | /Binaries 2 | /Intermediate -------------------------------------------------------------------------------- /Config/FilterPlugin.ini: -------------------------------------------------------------------------------- 1 | [FilterPlugin] 2 | ; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and 3 | ; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively. 4 | ; 5 | ; Examples: 6 | ; /README.txt 7 | ; /Extras/... 8 | ; /Binaries/ThirdParty/*.dll 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 How2Compute 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Socketer 2 | A TCP socket blueprint library for Unreal Engine 4 - NOW WITH SUPPORT FOR Unreal Engine 5.0! 3 | 4 | ## How do I install Socketer? 5 | To install Socketer, head to [releases](https://github.com/How2Compute/Socketer/releases), and download the latest (pre-compiled) copy for your engine version. Now head to where your engine is installed (likely `C:/Program Files/Epic Games/UE_XXX`), and open up `Engine/Plugins`. I recommend creating a folder to house downloaded plugins, so why not create one named `Downloaded`? Once you've created this folder, copy the `Socketer-UExyz` directory over from your zip file. Once you've done this, rename it to "Socketer", and you're set! You may need to restart Unreal Engine for the plugin to be detected. 6 | 7 | ## How do I enable Socketer? 8 | Once you've installed Socketer, open up your project, and head to Edit -> Plugins. Now find the Networking category, and search for Socketer. Once you've found it, press the enabled checkbox, and restart your project. Socketer should now be installed and enabled in your project! 9 | 10 | ## Where do I find out more? 11 | Please view the following Unreal Engine Forum thread: [https://forums.unrealengine.com/community/community-content-tools-and-tutorials/112836-socketer-free-tcp-socket-blueprint-plugin](https://forums.unrealengine.com/community/community-content-tools-and-tutorials/112836-socketer-free-tcp-socket-blueprint-plugin) 12 | 13 | ## Where do I report issues? 14 | To report an issue, please head to this project's [GitHub issues page](https://github.com/How2Compute/Socketer/issues). You can also use the forum thread. 15 | 16 | # Word of warning 17 | Socketer is an older project, and was designed as a one-to-one implementation of the FSocket interface (or atleast, the relevant & TCP parts of it). This means that you should be aware of how sockets work, and be careful to close your sockets, and check if there is any data available before trying to read it. Not taking these precautions, can lead to hangs, crashes, and other unexpected/undeired behavior in your game. With that out of the way - you are free to open up an issue or Pull Request with any improvement/issues! 18 | 19 | # Need Secured Sockets (SSL/TLS), Hashing, Encryption & More? 20 | Please consider checking out [NetShield](https://www.unrealengine.com/marketplace/netshield), our Unreal Engine 4 plugin that provides all of the above, and more! 21 | -------------------------------------------------------------------------------- /Resources/Icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/How2Compute/Socketer/559e3590674a9eb166615494580b5c02078f5137/Resources/Icon128.png -------------------------------------------------------------------------------- /Socketer.uplugin: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "Version": 1, 4 | "VersionName": "0.5", 5 | "FriendlyName": "Socketer", 6 | "Description": "An FSocket wrapper library for Blueprints. WARNING: This is an almost direct mapping, and the sockets are unmanaged, so use caution.", 7 | "Category": "Networking", 8 | "CreatedBy": "HowToCompute", 9 | "CreatedByURL": "https://h2cstudios.com", 10 | "EngineVersion": "5.4.0", 11 | "DocsURL": "https://forums.unrealengine.com/community/community-content-tools-and-tutorials/112836-socketer-free-tcp-socket-blueprint-plugin", 12 | "MarketplaceURL": "", 13 | "SupportURL": "https://forums.unrealengine.com/community/community-content-tools-and-tutorials/112836-socketer-free-tcp-socket-blueprint-plugin", 14 | "CanContainContent": true, 15 | "IsBetaVersion": false, 16 | "Installed": true, 17 | "RequiresBuildPlatform": false, 18 | "Modules": [ 19 | { 20 | "Name": "Socketer", 21 | "Type": "Runtime", 22 | "LoadingPhase": "PreLoadingScreen", 23 | "WhitelistPlatforms": [ "Win64" ] 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /Source/Socketer/Private/Socket.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright 2017-2020 HowToCompute. All Rights Reserved. 2 | * You may use, distribute and modify this code under the 3 | * terms of the MIT license. 4 | * 5 | * You should have received a copy of the MIT license with 6 | * this file. If not, please visit: https://github.com/How2Compute/Socketer. 7 | * 8 | * This plugin provides a very simple, almost 1:1 mapping 9 | * between Unreal Engine's FSocket library and Blueprints. 10 | * For a more easy-to-use plugin, with support for SSL, 11 | * encryption, "managed" sockets, timely updates, premium 12 | * support and more please consider taking a look at our 13 | * commercial offering, NetShield: 14 | * https://www.unrealengine.com/marketplace/en-US/product/netshield 15 | */ 16 | 17 | #include "Socket.h" 18 | #include "Socketer.h" 19 | 20 | bool USocketerSocket::SetSocket(FSocket* Socket) 21 | { 22 | _Socket = Socket; 23 | return false; 24 | } 25 | 26 | FSocket* USocketerSocket::GetSocket() 27 | { 28 | return _Socket; 29 | } 30 | -------------------------------------------------------------------------------- /Source/Socketer/Private/Socketer.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright 2017-2020 HowToCompute. All Rights Reserved. 2 | * You may use, distribute and modify this code under the 3 | * terms of the MIT license. 4 | * 5 | * You should have received a copy of the MIT license with 6 | * this file. If not, please visit: https://github.com/How2Compute/Socketer. 7 | * 8 | * This plugin provides a very simple, almost 1:1 mapping 9 | * between Unreal Engine's FSocket library and Blueprints. 10 | * For a more easy-to-use plugin, with support for SSL, 11 | * encryption, "managed" sockets, timely updates, premium 12 | * support and more please consider taking a look at our 13 | * commercial offering, NetShield: 14 | * https://www.unrealengine.com/marketplace/en-US/product/netshield 15 | */ 16 | 17 | #include "Socketer.h" 18 | 19 | #define LOCTEXT_NAMESPACE "FSocketerModule" 20 | 21 | void FSocketerModule::StartupModule() 22 | { 23 | // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module 24 | 25 | } 26 | 27 | void FSocketerModule::ShutdownModule() 28 | { 29 | // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, 30 | // we call this function before unloading the module. 31 | 32 | } 33 | 34 | #undef LOCTEXT_NAMESPACE 35 | 36 | IMPLEMENT_MODULE(FSocketerModule, Socketer) -------------------------------------------------------------------------------- /Source/Socketer/Private/SocketerBPLibrary.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright 2017-2020 HowToCompute. All Rights Reserved. 2 | * You may use, distribute and modify this code under the 3 | * terms of the MIT license. 4 | * 5 | * You should have received a copy of the MIT license with 6 | * this file. If not, please visit: https://github.com/How2Compute/Socketer. 7 | * 8 | * This plugin provides a very simple, almost 1:1 mapping 9 | * between Unreal Engine's FSocket library and Blueprints. 10 | * For a more easy-to-use plugin, with support for SSL, 11 | * encryption, "managed" sockets, timely updates, premium 12 | * support and more please consider taking a look at our 13 | * commercial offering, NetShield: 14 | * https://www.unrealengine.com/marketplace/en-US/product/netshield 15 | */ 16 | 17 | #include "SocketerBPLibrary.h" 18 | #include "Socketer.h" 19 | 20 | USocketerBPLibrary::USocketerBPLibrary(const FObjectInitializer& ObjectInitializer) 21 | : Super(ObjectInitializer) 22 | { 23 | 24 | } 25 | 26 | USocketerSocket* USocketerBPLibrary::Connect(FString Host, int32 port, bool& bSuccessful) 27 | { 28 | // Create an FSocket pointer to work with and an USocke pointer to return. 29 | FSocket* MySockTemp = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("Socketer TCP Socket"), false); 30 | USocketerSocket* NetSock = NewObject(); 31 | 32 | // Now attempt to parse (& resolve) up the passed in hostname or IP. 33 | FAddressInfoResult LookupResult = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->GetAddressInfo(*Host, nullptr, EAddressInfoFlags::Default, NAME_None); 34 | if (LookupResult.ReturnCode != ESocketErrors::SE_NO_ERROR || LookupResult.Results.Num() < 1) 35 | { 36 | UE_LOG(LogTemp, Warning, TEXT("Unable to resolve host \"%s\"!"), *Host); 37 | bSuccessful = false; 38 | return nullptr; 39 | } 40 | 41 | // Lookup was a success! Grab the first result and use the passed in port 42 | TSharedRef SockAddr = LookupResult.Results[0].Address; 43 | SockAddr->SetPort(port); 44 | 45 | // Attempt to connect, and store if it succeeded in a variable 46 | bool connected = MySockTemp->Connect(*SockAddr); 47 | 48 | // Verify it is connected 49 | if (!connected) 50 | { 51 | // And if not log an error and return an error 52 | UE_LOG(LogTemp, Error, TEXT("Could not connect")); 53 | bSuccessful = false; 54 | return nullptr; 55 | } 56 | 57 | // Set the UObject wrappers its socket to the connected one 58 | NetSock->SetSocket(MySockTemp); 59 | 60 | bSuccessful = true; 61 | return NetSock; 62 | } 63 | 64 | bool USocketerBPLibrary::SendMessage(USocketerSocket * Connection, FString Message) 65 | { 66 | 67 | // If the passed in socket is not valid 68 | if (!IsValid(Connection)) 69 | { 70 | return false; 71 | } 72 | 73 | // Set an FSocket pointer to the socket inside of the passed in USocket 74 | FSocket* MySocket = Connection->GetSocket(); 75 | 76 | // Check if it is not a null pointer 77 | if (MySocket == nullptr) 78 | { 79 | return false; 80 | } 81 | 82 | // Serialize the message 83 | TCHAR *serializedChar = Message.GetCharArray().GetData(); 84 | // Get / setup parameters 85 | int32 size = FCString::Strlen(serializedChar); 86 | int32 sent = 0; 87 | 88 | // Send the message 89 | bool successful = MySocket->Send((uint8*)TCHAR_TO_UTF8(serializedChar), size, sent); 90 | 91 | // And check if there was an error 92 | if (!successful) 93 | { 94 | UE_LOG(LogTemp, Error, TEXT("Error sending message!!")); 95 | return false; 96 | } 97 | else 98 | { 99 | return true; 100 | } 101 | } 102 | 103 | bool USocketerBPLibrary::GetMessage(USocketerSocket* Connection, FString &Message) 104 | { 105 | // If the passed in socket is not valid 106 | if (!IsValid(Connection)) 107 | { 108 | return false; 109 | } 110 | 111 | // Set an FSocket pointer to the socket inside of the passed in USocket 112 | FSocket* MySocket = Connection->GetSocket(); 113 | 114 | // Check if it is not a null pointer 115 | if (MySocket == nullptr) 116 | { 117 | return false; 118 | } 119 | 120 | 121 | // Credit to RAMA for this converter! 122 | //Binary Array! 123 | TArray BinaryData; 124 | uint32 Size; 125 | 126 | while (MySocket->HasPendingData(Size)) 127 | { 128 | // Be sure that the array doesn't become absolutely insanely large 129 | BinaryData.Init(0, FMath::Min(Size, 65507u)); 130 | 131 | // Set the counter for the ammount of bytes read to 0 132 | int32 Read = 0; 133 | // Recieve the data from the socket and put it into the binary array 134 | MySocket->Recv(BinaryData.GetData(), BinaryData.Num(), Read); 135 | } 136 | 137 | // Check if there was actually data read into the array 138 | if (BinaryData.Num() <= 0) 139 | { 140 | // No data was read! 141 | UE_LOG(LogTemp, Warning, TEXT("No data to read!")); 142 | return false; 143 | } 144 | else 145 | { 146 | // Be sure to \0 terminate the array 147 | BinaryData.Add(0); 148 | // Convert it to an fstring and set the passed in message parameter 149 | Message = FString(ANSI_TO_TCHAR(reinterpret_cast(BinaryData.GetData()))); 150 | return true; 151 | } 152 | 153 | 154 | } 155 | 156 | bool USocketerBPLibrary::HasPendingData(USocketerSocket * Connection) 157 | { 158 | // If the passed in socket is not valid 159 | if (!IsValid(Connection)) 160 | { 161 | return false; 162 | } 163 | 164 | // Set an FSocket pointer to the socket inside of the passed in USocket 165 | FSocket* MySocket = Connection->GetSocket(); 166 | 167 | // Check if it is not a null pointer 168 | if (MySocket == nullptr) 169 | { 170 | return false; 171 | } 172 | 173 | // Unused but required for the function to work 174 | uint32 Size; 175 | 176 | // Return if the socket has pending data 177 | return MySocket->HasPendingData(Size); 178 | } 179 | 180 | bool USocketerBPLibrary::CloseConnection(USocketerSocket * Connection) 181 | { 182 | // If the passed in socket is not valid 183 | if (!IsValid(Connection)) 184 | { 185 | return false; 186 | } 187 | 188 | // Set an FSocket pointer to the socket inside of the passed in USocket 189 | FSocket* MySocket = Connection->GetSocket(); 190 | 191 | // Check if it is not a null pointer 192 | if (MySocket == nullptr) 193 | { 194 | return false; 195 | } 196 | 197 | // Attempt to close it and return if it was successful or not 198 | return MySocket->Close(); 199 | } 200 | 201 | -------------------------------------------------------------------------------- /Source/Socketer/Public/Socket.h: -------------------------------------------------------------------------------- 1 | /* Copyright 2017-2020 HowToCompute. All Rights Reserved. 2 | * You may use, distribute and modify this code under the 3 | * terms of the MIT license. 4 | * 5 | * You should have received a copy of the MIT license with 6 | * this file. If not, please visit: https://github.com/How2Compute/Socketer. 7 | * 8 | * This plugin provides a very simple, almost 1:1 mapping 9 | * between Unreal Engine's FSocket library and Blueprints. 10 | * For a more easy-to-use plugin, with support for SSL, 11 | * encryption, "managed" sockets, timely updates, premium 12 | * support and more please consider taking a look at our 13 | * commercial offering, NetShield: 14 | * https://www.unrealengine.com/marketplace/en-US/product/netshield 15 | */ 16 | 17 | #pragma once 18 | 19 | #include "UObject/NoExportTypes.h" 20 | #include "Runtime/Sockets/Public/Sockets.h" 21 | #include "Runtime/Sockets/Public/SocketSubsystem.h" 22 | #include "Socket.generated.h" 23 | 24 | /** 25 | * 26 | */ 27 | UCLASS(BlueprintType) 28 | class SOCKETER_API USocketerSocket : public UObject 29 | { 30 | GENERATED_BODY() 31 | public: 32 | bool SetSocket(FSocket* Socket); 33 | FSocket* GetSocket(); 34 | 35 | private: 36 | FSocket* _Socket; 37 | 38 | }; 39 | -------------------------------------------------------------------------------- /Source/Socketer/Public/Socketer.h: -------------------------------------------------------------------------------- 1 | /* Copyright 2017-2020 HowToCompute. All Rights Reserved. 2 | * You may use, distribute and modify this code under the 3 | * terms of the MIT license. 4 | * 5 | * You should have received a copy of the MIT license with 6 | * this file. If not, please visit: https://github.com/How2Compute/Socketer. 7 | * 8 | * This plugin provides a very simple, almost 1:1 mapping 9 | * between Unreal Engine's FSocket library and Blueprints. 10 | * For a more easy-to-use plugin, with support for SSL, 11 | * encryption, "managed" sockets, timely updates, premium 12 | * support and more please consider taking a look at our 13 | * commercial offering, NetShield: 14 | * https://www.unrealengine.com/marketplace/en-US/product/netshield 15 | */ 16 | 17 | #pragma once 18 | 19 | #include "Modules/ModuleManager.h" 20 | 21 | class FSocketerModule : public IModuleInterface 22 | { 23 | public: 24 | 25 | /** IModuleInterface implementation */ 26 | virtual void StartupModule() override; 27 | virtual void ShutdownModule() override; 28 | }; -------------------------------------------------------------------------------- /Source/Socketer/Public/SocketerBPLibrary.h: -------------------------------------------------------------------------------- 1 | /* Copyright 2017-2020 HowToCompute. All Rights Reserved. 2 | * You may use, distribute and modify this code under the 3 | * terms of the MIT license. 4 | * 5 | * You should have received a copy of the MIT license with 6 | * this file. If not, please visit: https://github.com/How2Compute/Socketer. 7 | * 8 | * This plugin provides a very simple, almost 1:1 mapping 9 | * between Unreal Engine's FSocket library and Blueprints. 10 | * For a more easy-to-use plugin, with support for SSL, 11 | * encryption, "managed" sockets, timely updates, premium 12 | * support and more please consider taking a look at our 13 | * commercial offering, NetShield: 14 | * https://www.unrealengine.com/marketplace/en-US/product/netshield 15 | */ 16 | 17 | #pragma once 18 | 19 | #include "CoreMinimal.h" 20 | #include "Kismet/BlueprintFunctionLibrary.h" 21 | #include "Socket.h" 22 | #include "Runtime/Sockets/Public/Sockets.h" 23 | #include "Runtime/Sockets/Public/SocketSubsystem.h" 24 | #include "SocketerBPLibrary.generated.h" 25 | 26 | /* 27 | * TCP FSocket wrapper library for Unreal Engine 4. 28 | * 29 | * NOTE: This is a near 1-on-1wrapper, so use it with caution. 30 | * You are fully responsible for closing sockets, and ensuring 31 | * that there is data to be read. Not doing so, can result in 32 | * undefined and unwanted behavior. 33 | */ 34 | UCLASS() 35 | class USocketerBPLibrary : public UBlueprintFunctionLibrary 36 | { 37 | GENERATED_UCLASS_BODY() 38 | 39 | /* 40 | * Connect to a TCP server. 41 | * 42 | * @param Host The host name or IP address of the server you'd like to connect to. 43 | * @param port The port your server application is listening on. 44 | * 45 | * @param success True if a connection was correctly established, false otherwise. 46 | */ 47 | UFUNCTION(BlueprintCallable, meta = (DisplayName = "Connect to a TCP server", Keywords = "Socketer connect tcp tcpconnect socketerconnect"), Category = "Networking|Socketer") 48 | static USocketerSocket* Connect(FString Host, int32 port, bool &success); 49 | 50 | /* 51 | * Send a string over a TCP connection. 52 | * 53 | * @Param Connection TCP socket connection to send the message over. 54 | * @Param Message The string to send to the server. 55 | * 56 | * @return True if a message was successfully sent, false otherwise. 57 | */ 58 | UFUNCTION(BlueprintCallable, meta = (DisplayName = "Send message to the server", Keywords = "Socketer send message tcpsend tcp tcpdisconnect socketersend"), Category = "Networking|Socketer") 59 | static bool SendMessage(USocketerSocket* Connection, FString Message); 60 | 61 | /* 62 | * Receive a string from a TCP connection. WARNING: Game could hang till timeout if no data is available, please check using HasPendingData first. 63 | * 64 | * @Param Connection TCP socket connection to receive the message from. 65 | * 66 | * @Param Message The received message 67 | * @return True if a message was successfully received, false otherwise. 68 | */ 69 | UFUNCTION(BlueprintCallable, meta = (DisplayName = "Get buffer (converted to FString) from server", Keywords = "Socketer send message tcpsend tcp tcpdisconnect socketersend"), Category = "Networking|Socketer") 70 | static bool GetMessage(USocketerSocket* Connection, FString &Message); 71 | 72 | /* 73 | * Checks if a TCP connection has any pending data. 74 | * 75 | * @Param Connection TCP socket connection to check. 76 | * 77 | * @Param Message The received message 78 | * @return True if a message was successfully received, false otherwise. 79 | */ 80 | UFUNCTION(BlueprintCallable, BlueprintPure, meta = (DisplayName = "HasPendingData", Keywords = "Socketer send message tcpsend tcp tcpdisconnect socketersend"), Category = "Networking|Socketer") 81 | static bool HasPendingData(USocketerSocket* Connection); 82 | 83 | /* 84 | * Closes a TCP connection 85 | * 86 | * @Param Connection The TCP connection to close 87 | * 88 | * @return True if the socket was successfully closed, false otherwise. 89 | */ 90 | UFUNCTION(BlueprintCallable, meta = (DisplayName = "Close connection to TCP server", Keywords = "Socketer disconnect close tcpclose tcp tcpdisconnect socketerdisconnect"), Category = "Networking|Socketer") 91 | static bool CloseConnection(USocketerSocket* Connection); 92 | }; 93 | -------------------------------------------------------------------------------- /Source/Socketer/Socketer.Build.cs: -------------------------------------------------------------------------------- 1 | /* Copyright 2017-2020 HowToCompute. All Rights Reserved. 2 | * You may use, distribute and modify this code under the 3 | * terms of the MIT license. 4 | * 5 | * You should have received a copy of the MIT license with 6 | * this file. If not, please visit: https://github.com/How2Compute/Socketer. 7 | * 8 | * This plugin provides a very simple, almost 1:1 mapping 9 | * between Unreal Engine's FSocket library and Blueprints. 10 | * For a more easy-to-use plugin, with support for SSL, 11 | * encryption, "managed" sockets, timely updates, premium 12 | * support and more please consider taking a look at our 13 | * commercial offering, NetShield: 14 | * https://www.unrealengine.com/marketplace/en-US/product/netshield 15 | */ 16 | 17 | using UnrealBuildTool; 18 | 19 | public class Socketer : ModuleRules 20 | { 21 | public Socketer(ReadOnlyTargetRules Target) : base(Target) 22 | { 23 | // Force IWYU to ensure the plugin will always be IWYU compliant 24 | IWYUSupport = IWYUSupport.Full; 25 | PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; 26 | 27 | PublicDependencyModuleNames.AddRange( 28 | new string[] 29 | { 30 | "Core", 31 | "Sockets", 32 | "Networking", 33 | } 34 | ); 35 | 36 | 37 | PrivateDependencyModuleNames.AddRange( 38 | new string[] 39 | { 40 | "CoreUObject", 41 | "Engine", 42 | "Slate", 43 | "SlateCore", 44 | } 45 | ); 46 | } 47 | } 48 | --------------------------------------------------------------------------------