UE5 独立程序的网络TCP/UDP服务器与客户端基础流程

引擎源码版,复制\Engine\Source\Programs\路径下的BlankProgram空项目示例。

重命名BlankProgram,例如CustomTcpProgram,并修改项目名称。

 修改.Build.cs内容

修改Target.cs内容 

 

 修改Private文件夹内.h.cpp文件名并修改.cpp内容

刷新引擎

在项目.Build.cs中加入模块

// Copyright Epic Games, Inc. All Rights Reserved.using UnrealBuildTool;public class TCPSocketServer : ModuleRules
{public TCPSocketServer(ReadOnlyTargetRules Target) : base(Target){PublicIncludePathModuleNames.Add("Launch");PrivateDependencyModuleNames.Add("Core");PrivateDependencyModuleNames.Add("Projects");//加入网络模块PrivateDependencyModuleNames.Add("Sockets");PrivateDependencyModuleNames.Add("ApplicationCore");// to link with CoreUObject module:// PrivateDependencyModuleNames.Add("CoreUObject");// to enable tracing:// AppendStringToPublicDefinition("UE_TRACE_ENABLED", "1");// to enable LLM tracing:// GlobalDefinitions.Add("LLM_ENABLED_IN_CONFIG=1");// GlobalDefinitions.Add("UE_MEMORY_TAGS_TRACE_ENABLED=1");}
}

 .cpp

// Copyright Epic Games, Inc. All Rights Reserved.#include "TCPSocketServer.h"#include "RequiredProgramMainCPPInclude.h"
#include "Sockets.h"
#include "SocketSubsystem.h"DEFINE_LOG_CATEGORY_STATIC(LogTCPSocketServer, Log, All);IMPLEMENT_APPLICATION(TCPSocketServer, "TCPSocketServer");INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{//应用初始化设置  GEngineLoop.PreInit(ArgC,ArgV);// 获取网络套接字子系统ISocketSubsystem* SocketSubsystem = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM);// 创建一个TCP类型的套接字,命名为"This TcpIp Type"FSocket* Socket = SocketSubsystem->CreateSocket(NAME_Stream,TEXT("This TcpIp Type"));// 创建一个互联网地址对象,用于指定服务器的IP地址和端口号TSharedPtr<FInternetAddr> Addr = SocketSubsystem->CreateInternetAddr();Addr->SetPort(8888);bool bIsValid = false;Addr->SetIp(TEXT("127.0.0.1"),bIsValid);Socket->Bind(*Addr);Socket->Listen(128);while (true){// 接受一个新的客户端连接请求,并返回一个新的套接字对象来表示这个连接FSocket* ClinetSocket = Socket->Accept(TEXT("ClinetConnect"));// 创建一个字节数组用于存储接收到的数据uint8 Buf[1024]{0};//存储实际读取到的字节数int32 BytesRead = 0;// 从客户端套接字读取数据到Buf数组中,最多读取1024字节,并将实际读取的字节数存储在BytesRead中ClinetSocket->Recv(Buf,1024,BytesRead);// 将接收到的字节数组转换为TCHAR字符串(用于UE5的字符串处理)FString Msg = UTF8_TO_TCHAR(reinterpret_cast<char *>(Buf));UE_LOG(LogTCPSocketServer,Display,TEXT("Msg = %s||Len = %d"),*Msg,BytesRead);}
}
/*
*TArray<FSocket*> Sockets; // 假设这是你的套接字列表  // 遍历套接字列表  
for (int i = 0; i < Sockets.Num(); i++)  
{  
FSocket* Socket = Sockets[i];  
FInternetAddr* RemoteAddr = Socket->GetRemoteAddress();  // 获取远程地址的IP和端口号  
FString IP;  
uint16 Port;  
RemoteAddr->GetIP(IP);  
RemoteAddr->GetPort(Port);  // 使用IP和端口号进行进一步的处理或记录等操作  
UE_LOG(LogTCPSocketServer, Display, TEXT("Client IP: %s, Port: %d"), *IP, Port);  
}
*/

客户端.cpp

// Copyright Epic Games, Inc. All Rights Reserved.#include "TCPSocketClient.h"#include "RequiredProgramMainCPPInclude.h"
#include "Sockets.h"
#include "SocketSubsystem.h"DEFINE_LOG_CATEGORY_STATIC(LogTCPSocketClient, Log, All);IMPLEMENT_APPLICATION(TCPSocketClient, "TCPSocketClient");INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{GEngineLoop.PreInit(ArgC,ArgV);ISocketSubsystem* SocketSubsystem = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM);FSocket* Socket = SocketSubsystem->CreateSocket(NAME_Stream,TEXT("This Tcp Client"));TSharedPtr<FInternetAddr> Addr = SocketSubsystem->CreateInternetAddr();Addr->SetPort(8888);bool bIsValid = false;Addr->SetIp(TEXT("127.0.0.1"),bIsValid);if (Socket->Connect(*Addr)){FString Msg = TEXT("Hello Server");int32 SendSize = 0;Socket->Send(reinterpret_cast<uint8*>(TCHAR_TO_UTF8(*Msg)),Msg.Len(),SendSize);}Socket->Close();SocketSubsystem->DestroySocket(Socket);UE_LOG(LogTCPSocketClient, Display, TEXT("Hello World"));FEngineLoop::AppExit();return 0;
}

未完待续。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/242745.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++入门学习(七)整型

整型就是整数类型的数据&#xff08;-1&#xff0c;0&#xff0c;1等等&#xff09; 数据类型占用空间取值范围short(短整型)2字节 (-2^15 ~ 2^15-1) 32768~32767 int(整型)4字节(-2^31 ~ 2^31-1)long(长整形) Windows为4字节, Linux为4字节(32位), 8字节(64位) (-2^31 ~ 2^31…

为什么需要放行回源IP

为什么需要放行回源IP 网站以“独享模式”成功接入WAF后&#xff0c;所有网站访问请求将先经过独享引擎配置的ELB然后流转到独享引擎实例进行监控&#xff0c;经独享引擎实例过滤后再返回到源站服务器&#xff0c;流量经独享引擎实例返回源站的过程称为回源。在服务器看来&…

16.5 参考文献——深度学习定位

16.5 一种高效鲁棒的多楼层室内环境指纹定位方法 同济大学 Zhao Y, Gong W, Li L, et al. An Efficient and Robust Fingerprint Based Localization Method for Multi Floor Indoor Environment[J]. IEEEa Internet of Things Journal, 2023. 2.相关工作 B.基于深度学习的…

ChatGPT时代对大数据应用的展望

前言&#xff1a; 2022年底&#xff0c;科技圈有个爆炸性新闻&#xff0c;ChatGPT的诞生&#xff0c;引发了世界范围内的震惊&#xff1b;人工智能在与人交流上有了划时代的技术突破&#xff0c;可以和人深入的理解交流&#xff0c;让许多公司和领域对这项技术有了更多遐想。对…

HarmonyOS之sqlite数据库的使用

从API Version 9开始&#xff0c;鸿蒙开发中sqlite使用新接口ohos.data.relationalStore 但是 relationalStore在 getRdbStore操作时&#xff0c;在预览模式运行或者远程模拟器运行都会报错&#xff0c;导致无法使用。查了一圈说只有在真机上可以正常使用&#xff0c;因此这里…

Docker进阶篇-安装MySQL主从复制

一、MySQL主服务器 1、新建主服务器容器实例3307 docker run -p 3307:3306 \--name mysql-master \--privilegedtrue \-v /mydata/mysql-master/log:/var/log/mysql \-v /mydata/mysql-master/data:/var/lib/mysql \-v /mydata/mysql-master/conf:/etc/mysql \-e MYSQL_ROOT_…

String在VS与Linux下的区别

目录 一、string的成员 1.VS 2.Linux 二、string的扩容机制 1. VS 2.Linux 一、string的成员 string是C标准库中的一个类模板&#xff0c;用于表示和操作字符串 string在 Windows 与 Linux 中的成员不是相同的 1.VS 4个成员&#xff1a;_str , _size , _capacity 和…

RHEL8_安装软件的方法和系统初始化

参考&#xff1a; 资料来自下面链接&#xff1a; 第1章 动手部署一台Linux操作系统 | 《Linux就该这么学》 (linuxprobe.com)https://www.linuxprobe.com/basic-learning-01.html 一、安装软件的方法 RPM、Yum、DNF 常用的RPM软件包命令 命令 作用 rpm -ivh filename.rpm安装…

proteus8.15安装教程

proteus8.15安装教程 1.管理员运行 2.一直NEXT到这一步&#xff0c;需要注意&#xff0c;一定要选这一个 3.选中后出现 4.一直下一步到更新 这边结束后准备激活&#xff1a; 1.安装激活插件&#xff0c;先关闭防火墙 2.下一步 3.最后&#xff0c;将数据库放在根目录下 …

【总结】Linux命令中文帮助手册

1. 为什么要总结Linux命令中文帮助手册 Linux 官方并不提供中文的 help、man 帮助手册。网络上已有的前人翻译过的中文手册版本比较老&#xff0c;且翻译存在误差。从记忆角度来看&#xff0c;Linux 很多命令都不一定记得住详细的用法&#xff0c;易遗忘&#xff0c;缺少经验总…

PIG框架学习3——Redisson 实现业务接口幂等

零、前言 ​ 业务接口幂等问题是在开发中遇到的&#xff0c;如果对业务接口代码不进行幂等控制&#xff0c;并且在前端没有对请求进行限制的情况下&#xff0c;可能会出现多次对接口调用&#xff0c;导致错误异常的发生。就上述情况&#xff0c;对PIGX自带的业务接口幂等实现进…

渐进式哈希和SpringBoot集成redis

一)渐进式遍历 1)keys可以一次性的把整个redis中的所有的key都获取到&#xff0c;keys *&#xff0c;这个操作比较危险可能会一下子得到过多的key&#xff0c;从而会造成redis阻塞&#xff0c;因为redis是一个单线程的服务器&#xff0c;通过渐进式遍历&#xff0c;可以做到既能…

uni-app使用HBuilderX打包Web项目

非常简单&#xff0c;就是容易忘记 一、找到manifest.json配置Web配置 二、源码视图配置 "h5" : {"template" : "","domain" : "xxx.xx.xx.xxx","publicPath" : "./","devServer" : {&quo…

数据库防水坝是什么?有什么作用?有哪些优势?

数据库是公司重要IT资产&#xff0c;是公司数据存储、数据整合、数据备份等重要载体。所以保障数据库安全至关重要。目前保障数据库安全产品较多&#xff0c;例如堡垒机、防火墙、数据库防水坝等等。今天我们就先来简单了解一下数据库防水坝是什么&#xff1f;有什么作用&#…

C语言从入门到实战——编译和链接

编译和链接 前言一、 翻译环境和运行环境二、 翻译环境2.1 预处理&#xff08;预编译&#xff09;2.2 编译2.2.1 词法分析2.2.2 语法分析2.2.3 语义分析 2.3 汇编2.4 链接 三、 运行环境 前言 在C语言中&#xff0c;编译和链接是将源代码转换为可执行文件的两个主要步骤。 编…

SpringBoot 3.1.7 集成Sentinel

一、背景 我的项目需要引入限流&#xff0c;降级&#xff0c;熔断框架&#xff0c;由于 Spring Cloud 2022.0.4 已经不再支持 Hystrix&#xff0c;Spring Cloud 提供了替代方案&#xff0c;如 Resilience4j&#xff0c;可以使用它来替换 Hystrix。但是网上搜了一下国内Resilie…

多级缓存

一、多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; •请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时&#xff…

关于ElasticSearch,你应该知道的

一、集群规划优化实践 1、基于目标数据量规划集群 在业务初期&#xff0c;经常被问到的问题&#xff0c;要几个节点的集群&#xff0c;内存、CPU要多大&#xff0c;要不要SSD&#xff1f; 最主要的考虑点是&#xff1a;你的目标存储数据量是多大&#xff1f;可以针对目标数据…

鸿蒙开发系列教程(五)--ArkTS语言:组件开发

1、基础组件 组件API文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/84_u58f0_u660e_u5f0f_u5f00_u53d1_u8303_u5f0f_uff09-0000001427744776-V2 查看组件API 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 容…

去掉element-ui的el-table的所有边框+表头+背景颜色

实例: 1.去掉table表头(加上:show-header"false") <el-table:data"tableData":show-header"false"style"width: 100%"> </el-table> 2.去掉table所有边框 ::v-deep .el-table--border th.el-table__cell, ::v-deep .el…