----SocketServerActor.cpp
#include “SocketSeverActor.h”
#include
#include “Networking.h”
#include “Engine.h”
#include “CoreMinimal.h”
void ASocketSeverActor::BeginPlay()
{
Super::BeginPlay();
Start();
}
void ASocketSeverActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
bool ASocketSeverActor::StartTCPReceiver(const FString & YourChosenSocketName, const FString & TheIP, const int32 ThePort)
{
//Rama’s CreateTCPConnectionListener
ListenerSocket = CreateTCPConnectionListener(YourChosenSocketName, TheIP, ThePort);
//Not created?
if (!ListenerSocket)
{
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("StartTCPReceiver>> Listen socket could not be created! ~> %s %d"), *TheIP, ThePort));
UE_LOG(LogTemp, Log, TEXT("StartTCPReceiver>> Listen socket could not be created! ~> %s %d"), *TheIP, ThePort);
return false;
}
//Start the Listener! //thread this eventually
//GetWorldTimerManager().SetTimer(this, &AMyActorTest::TCPConnectionListener, 0.01, true);
FTimerHandle time_handler;
GetWorldTimerManager().SetTimer(time_handler, this, &ASocketServerActor::TCPConnectionListener, 0.01, true);
return true;
}
FSocket * ASocketSeverActor::CreateTCPConnectionListener(const FString & YourChosenSocketName, const FString & TheIP, const int32 ThePort, const int32 ReceiveBufferSize)
{
uint8 IP4Nums[4];
if (!FormatIP4ToNumber(TheIP, IP4Nums))
{
//VShow(“Invalid IP! Expecting 4 parts separated by .”);
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Create Socket
FIPv4Endpoint Endpoint(FIPv4Address(IP4Nums[0], IP4Nums[1], IP4Nums[2], IP4Nums[3]), ThePort);
FSocket* ListenSocket = FTcpSocketBuilder(*YourChosenSocketName).AsReusable().BoundToEndpoint(Endpoint).Listening(8);
//Set Buffer Size
int32 NewSize = 0;
ListenSocket->SetReceiveBufferSize(ReceiveBufferSize, NewSize);
//Done!
return ListenSocket;
}
void ASocketSeverActor::TCPConnectionListener()
{
//~~~~~~~~~~~~~
if (!ListenerSocket)
{
return;
}
//~~~~~~~~~~~~~
//Remote address
TSharedRef<FInternetAddr> RemoteAddress = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
bool Pending;
// handle incoming connections
if (ListenerSocket->HasPendingConnection(Pending))
{
// UE_LOG(LogTemp, Log, TEXT("TCPConnectionListener Pending = %d"), Pending);
if (Pending)
{
UE_LOG(LogTemp, Log, TEXT("TCPConnectionListener 1"));
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Already have a Connection? destroy previous
if (ConnectionSocket)
{
ConnectionSocket->Close();
ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(ConnectionSocket);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//New Connection receive!
ConnectionSocket = ListenerSocket->Accept(*RemoteAddress, TEXT("RamaTCP Received Socket Connection"));
if (ConnectionSocket != NULL)
{
//Global cache of current Remote Address
RemoteAddressForConnection = FIPv4Endpoint(RemoteAddress);
//can thread this too
FTimerHandle time_handler;
GetWorldTimerManager().SetTimer(time_handler, this, &ASocketServerActor::TCPSocketListener, 0.01, true);
}
}
}
}
void ASocketSeverActor::TCPSocketListener()
{
//~~~~~~~~~~~~~
if (!ConnectionSocket) return;
//~~~~~~~~~~~~~
//Binary Array!
TArray<uint8> ReceivedData;
uint32 Size;
while (ConnectionSocket->HasPendingData(Size))
{
UE_LOG(LogTemp, Log, TEXT("Size %d"), Size);
ReceivedData.Init(FMath::Min(Size, 4096u));
int32 Read = 0;
ConnectionSocket->Recv(ReceivedData.GetData(), ReceivedData.Num(), Read);
//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("Data Read! %d"), ReceivedData.Num()));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (ReceivedData.Num() <= 0)
{
return;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Rama's String From Binary Array
const FString ReceivedUE4String = StringFromBinaryArray(ReceivedData);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
UE_LOG(LogTemp, Log, TEXT("Receive : %s"), *ReceivedUE4String);
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("As String Data ~> %s"), *ReceivedUE4String));
}
bool ASocketSeverActor::FormatIP4ToNumber(const FString & TheIP, uint8(&Out)[4])
{
//IP Formatting
TheIP.Replace(TEXT(" “), TEXT(”"));
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// IP 4 Parts
//String Parts
TArray<FString> Parts;
TheIP.ParseIntoArray(Parts, TEXT("."), true);
if (Parts.Num() != 4)
return false;
//String to Number Parts
for (int32 i = 0; i < 4; ++i)
{
Out[i] = FCString::Atoi(*Parts[i]);
}
return true;
}
FString ASocketSeverActor::StringFromBinaryArray(const TArray& BinaryArray)
{
//Create a string from a byte array!
UE_LOG(LogTemp, Log, TEXT(“StringFromBinaryArray %d”), BinaryArray.Num());
std::string cstr(reinterpret_cast<const char*>(BinaryArray.GetData()), BinaryArray.Num());
UE_LOG(LogTemp, Log, TEXT("cstr.length %d"), cstr.length());
return FString(cstr.c_str());
}
void ASocketSeverActor::Start()
{
if (!StartTCPReceiver(“RamaSocketListener”, “192.168.168.110”, 1111))
{
UE_LOG(LogTemp, Log, TEXT(“TCP Socket Listener Created!”));
return;
}
UE_LOG(LogTemp, Log, TEXT("StartTCPReceiver Success!!"));
}
UnrealHeaderTool failed for target 'ServerEditor' (platform: Win64, module info: D:\Unreal\Server\Intermediate\Build\Win64\ServerEditor\Development\ServerEditor.uhtmanifest, exit code: OtherCompilationError (5)).
too few arguments in function call Server
The command "D:\Unreal\UE_4.18\Engine\Build\BatchFiles\Build.bat ServerEditor Win64 Development "D:\Unreal\Server\Server.uproject" -waitmutex" exited with code 5. Please verify that you have sufficient rights to run this command. Server
name followed by '::' must be a class or namespace name Server
class "UObject" has no member "Tick" Server
class "UObject" has no member "BeginPlay" Server
Sorry for poor English. I have those errors, and I don’t know how to solve it.
Please check my code.