虚幻Send UDP功能函数

bool UUDPBlueprintLibrary::SendUDP(const FString& Message, const FString& IPaddress, const int32 port)
{
// 创建一个 UDP 套接字
FSocket* UDPSocket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_DGram, TEXT("MyUDPSocket"), false);

if (!UDPSocket)
{
	UE_LOG(LogTemp, Error, TEXT("Failed to create UDP socket"));
	return false;
}

// 解析目标 IP 地址
FIPv4Address TargetAddress;
if (!FIPv4Address::Parse(IPaddress, TargetAddress))
{
	UE_LOG(LogTemp, Error, TEXT("Invalid IP address: %s"), *IPaddress);
	UDPSocket->Close();
	ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(UDPSocket);
	return false;
}

UDPSocket->SetReuseAddr(true);
TSharedPtr<FInternetAddr> InternetAddr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
InternetAddr->SetIp(TargetAddress.Value); // 使用解析后的 IP 地址
InternetAddr->SetPort(port);

// 将 FString 转换为字节数组
TArray<uint8> MessageBytes;
FTCHARToUTF8 UTF8Converter(*Message);
MessageBytes.Append((const uint8*)UTF8Converter.Get(), UTF8Converter.Length());

int32 BytesSent = 0;

// 发送数据
bool bSuccess = UDPSocket->SendTo(MessageBytes.GetData(), MessageBytes.Num(), BytesSent, *InternetAddr);

if (bSuccess)
{
	UE_LOG(LogTemp, Log, TEXT("Sent %d bytes to %s:%d"), BytesSent, *IPaddress, port);
}
else
{
	UE_LOG(LogTemp, Error, TEXT("Failed to send UDP message"));
}

// 关闭套接字
UDPSocket->Close();
ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(UDPSocket);

return bSuccess;

}

posted on 2025-03-06 09:40  Mnnder  阅读(50)  评论(0)    收藏  举报

导航