// Fill out your copyright notice in the Description page of Project Settings.
#include "UDPHandle.h"
#include "UDPCommunication.h"
#include "Common/UdpSocketBuilder.h"
#include "Common/UdpSocketReceiver.h"
#include "Common/UdpSocketSender.h"
UUDPHandle::UUDPHandle()
{
}
void UUDPHandle::CreateSocket(FUDPSocketSettings const& Settings, bool DeleteBefore)
{
if(DeleteBefore)
{
CloseSocket();
}
FIPv4Address IPv4Address;
if(FIPv4Address::Parse(Settings.BindIP, IPv4Address) == false)
{
UE_LOG(LogUDPCommunication, Error, TEXT("InitSocket IPv4 Parse Error! "));
return;
}
Socket = FUdpSocketBuilder(Settings.UDPName)
.AsReusable()
.AsNonBlocking()
.BoundToEndpoint(FIPv4Endpoint(IPv4Address, Settings.BindPort))
.WithSendBufferSize(Settings.BufferSize)
.WithReceiveBufferSize(Settings.BufferSize);
SocketSender = new FUdpSocketSender(Socket, *(Settings.UDPName + "_Sender"));
SocketReceiver = new FUdpSocketReceiver(Socket, FTimespan::FromMilliseconds(100), *(Settings.UDPName + "_Receiver"));
if(SocketReceiver)
{
SocketReceiver->OnDataReceived().BindLambda([this](const FArrayReaderPtr& DataPtr, const FIPv4Endpoint& Endpoint)
{
TArray<uint8> Data;
Data.AddUninitialized(DataPtr->TotalSize());
DataPtr->Serialize(Data.GetData(), DataPtr->TotalSize());
FString IP = Endpoint.Address.ToString();
int32 Port = Endpoint.Port;
AsyncTask(ENamedThreads::GameThread, [this, Data, IP, Port]()
{
UDPRecv.Broadcast(Data, IP, Port);
});
});
SocketReceiver->Start();
}
}
void UUDPHandle::CloseSocket()
{
if(SocketSender)
{
delete SocketSender;
SocketSender = nullptr;
}
if(SocketReceiver)
{
delete SocketReceiver;
SocketReceiver = nullptr;
}
if(Socket)
{
ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(Socket);
Socket = nullptr;
}
}
void UUDPHandle::SendData(const TArray<uint8>& Data, FString const& IP, int32 const& Port) const
{
if(SocketSender)
{
const TSharedRef<TArray<uint8>, ESPMode::ThreadSafe> Sender = MakeShared<TArray<uint8>, ESPMode::ThreadSafe>(Data);
FIPv4Endpoint Endpoint;
FIPv4Endpoint::Parse(IP + ":" + FString::FromInt(Port), Endpoint);
SocketSender->Send(Sender, Endpoint);
}
}
unreal UDP模块
需积分: 5 201 浏览量
2023-03-21
14:39:15
上传
评论
收藏 8KB ZIP 举报
一条单身狗!
- 粉丝: 26
- 资源: 7
最新资源
- 基于C和C++的二维绘制工具设计源码 - DrawPro
- Object.defineProperty 的 IE 补丁object-defineproperty-ie-master.zip
- 整卷预览.mhtml
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见的
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见的
- 基于Javascript的结婚请帖设计源码 - Invitation
- mysql语句大全及用法
- mysql语句大全及用法
- mysql语句大全及用法
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈