ue4集合类型_UE4-Sockets

Sockets(套接字)

套接字为通信的端点。通过网络通信的每进程需要使用一套接字。

套接字组成: IP地址 + 端口号

套接字采用客户机——服务器架构。

服务器通过监听指定端口,来等待客户请求。

实现特定服务的服务器监听众所周知的端口:

  • telent服务器端口,23
  • ftp服务器监听端口,21
  • web或http服务器,80

所有低于1024的端口都是众所周知的。

客户端

发出请求Socket: 客户端IP + 大于1024且唯一的端口号。 例如: 146.86.5.20:1625 所有连接都必须是唯一的,当另一个进程与同一个服务器建立连接时,应该被分配大于1024且不等于1625的端口。

IP 127.0.0.1为特殊IP,回送(loopback),它引用自己,这一机制允许同一主机的客户机和服务器可以通过TCP/IP协议进行通信。

BSD Sockts API

伯克利套接字(Berkeley sockets)定义了一组用于进程间Sockets通信的通用API,sockets的实现依赖于不同的操作系统各有所不同,在实现了BSD Sockets接口的操作系统上,就可以很方便地移植采用BSD Sockets API的应用程序。所有现代操作系统都实现了BSD Sockets。

常用API:

  • socket() 创建Socket,分配一些系统资源。
  • bind() 通常用于服务端,将一个socket和一个socket地址结构关联,它指定了本地IP地址和端口号,可设定为绑定到本机的任何IP。
  • listen() 用在服务端,使得一个被绑定的TCP socket进入监听状态。
  • connect() 用在客户端,分配给Socket一个空闲的端口号,对于TCP Socket,还会尝试建立一个新的TCP连接。
  • accept() 用在服务端,它接受来自远程客户端的创建TCP连接的请求(connect),并创建一个新的Socket来表示这次连接两端的Sockets。
  • send(), recv(), sendto(), and recvfrom() 用于发送和接收数据,标准IO函数write()read()也可以使用。
  • close() 使系统释放一个socket的资源,在TCP下,连接会终止。
  • gethostbyname() and gethostbyaddr() 用于获取host名字和地址。仅在IPv4下可用。
  • select() 用于挂起,等待列表中的一个或多个套接字准备好读取或写入或出现错误。
  • poll() 检查在socket集合中的一个socket的状态。这个集合可以被测试是否有socket可以被写入或读出或出现错误。
  • getsockopt() 获取一个socket的的指定socket 选项的当前值。
  • setsockopt() 设置一个socket的指定socket选项的值。

UE4 Sockets

UE4针对众多不同的操作系统的不同的Socket实现提供了同一的Socket编程接口。由于几乎所有操作系统都实现了BSD socket接口,利用这一点可以方便地统一一些基本的Socket接口。同时,不同的操作系统也提供了一些差异化的操作,这些操作由ISocketSubsystem定义。

class FSocket

这个类定义了类似于BSD socket API 的抽象接口。包括:

Close(),Bind(),Listen(), Connect(),Accept(),Send(),Recv(),等操作。

此外,还有一些便利操作:

WaitForPendingConnection(),HasPendingConnection(),可判断是否有连接请求。
HasPendingData(),查询是否有即将到来的数据可以接收。
RecvMulti(),一次读取多个数据包,

还有许多其它操作...

class FSocketBSD

FSocketBSD继承自FSocket,它实现了所有FSocket的接口,跨平台的操作就是在这里实现的。

首先会通过PLATFORM_HAS_BSD_SOCKETS判断当前平台是否支持BSD socket接口,以决定是否定义FSocketBSD类。

BSDSockets/SocketSubsystemBSDPrivate.h文件中,根据不同的平台包含不同平台的BSD socket API实现头文件。并统一原始Socket对象的类型为SOCKET,这一类型在WinSock中有定义:

    typedef UINT_PTR        SOCKET;

但在其它平台则没有,比如在Unix系统下就直接用的int类型表示socket对象指针。所以在其它情况下还会加上一些类型别名:

    typedef int32 SOCKET;// ... ...

它的几个成员变量:

/** Holds the BSD socket object. */SOCKET Socket;/** Last activity time. */double LastActivityTime;/** Pointer to the subsystem that created it. */ISocketSubsystem* SocketSubsystem;

其中SocketSubsystem表示的是创建这个FSocketBSD的子系统,其中定义的是平台特异的操作。

class ISocketSubsystem

这是抽象平台特异的sockets API的基本接口。其功能有:

  • Get(const FName&) 获取指定平台的ISocketSubsystem单例。
  • 不同平台的初始化操作
  • 创建和销毁Sockets。
  • Host name 到IP address 的域名解析。包括异步的域名解析。
  • 创建恰当的FInternetAddr表示。
  • CreateRecvMulti()
  • TMap<FString, TSharedPtr<FInternetAddr> > HostNameCache; host Name的缓存

class FSocketSubsystemBSD

此外,它还派生出FSocketSubsystemBSD对应于FSocketBSD。它实现了标准的BSD支持的一些socket 子系统的操作。

也是在这里,实现了CreateSocket(), 其中也是调用了平台特异的BSD socket API socket()实现的。先通过平台特异的原始socket()构造函数创建SOCKET,这一步其实将所有支持BSD socket API 的操作系统都考虑了进去,再进一步创建FSocketBSD,最后根据ISocketSubsystem定义的接口,返回FSocket.

Observe

UE 定义的这一Socket模块,大体上分两个主要的继承线路,一个是FSocket是表示通信的一端的socket,定义了BSD 中的常规操作,以及一些额外的便利操作(RecvMulti())。另一条是ISocketSubsystem,这是抽象平台特异的功能的基本接口,同时也负责FSocket对象的创建,域名解析等其它功能。

通常情况下,下一步就可以是各个平台的FSocket 和ISocketSubsystem的派生实现了,但是,考虑到几乎所有操作系统都实现了BSD socket API,所以先加了一层FSocketBSDFSocketSubsystemBSD,也是在这里,两者产生了直接引用,FSocketBSD保存了一个ISocketSubsystem指针。这一层其实已经实现了绝大部分的功能。

再往后就是每个平台的继承和实现,大多数只是Subsystem部分的Create(),Init()等操作,部分的FSocketBSD有继承下来改动Multi相关的操作。

ISocketSubsystem::Get()获取不同平台的单例ISocketSubsystem实例,在其上进一步调用CreateSocket创建FSocket.

UE4 采用Module来管理不同的平台ISocketSubsystem的创建和销毁。FSocketSubsystemWindows调用CreateSocketSubsystemDestroySocketSubsystem来创建和销毁子系统。这两个函数extern 声明在SocketSubsystem.cpp中,而对应对每个平台的Subsystem类的cpp文件中都实现了这两个函数.

因此,Socket模块总的使用流程是:

  1. ISocketSubsystem::Get(const FName& SubsystemName)获取一个指定平台Name的子系统。
  2. ISocketSubsystem::Get中定义了一个静态结构体变量,它只有一个成员FSocketSubsystemModule,在这个静态变量初始化的时候,用FModuleManager::LoadModuleChecked<FSocketSubsystemModule>("Sockets")的返回值初始化FSocketSubsystemModule成员变量。最后返回GetSocketSubsystem(SubsystemName)的返回值。
  3. FSocketSubsystemModule在加载时就会初始化一个默认的子系统,通过直接调用CreateSocketSubsystem( *this )构建一个默认子系统,至于调用的是什么平台的实现版本,是由什么决定的?
  4. 在获取到了一个ISocketSubsystem后,就可以调用ISocketSubsystem::CreateSocket创建一个相关平台的Socket,这个Socket的动态类型可能是FSocketBSD,也可能是相关平台定义的子类比如FSocketBSDIOS,这又取决于这个子系统的动态类型,最终又取决于调用ISocketSubsystem的静态函数Get时的参数SubsystemName通常应该是此时运行的平台。

Reference:

  • UE 4.23 Sockets模块源码.

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

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

相关文章

全域图像搜索给你更精准的搜索体验

摘要&#xff1a; 2018飞天技术汇&#xff0c;阿里巴巴机器智能技术实验室的刘磊带来题为全域精准图像搜索介绍的演讲&#xff0c;主要从四个方面进行了阐述&#xff0c;第一部分介绍了图像搜索的基本概念&#xff0c;第二部分主要是讲解了图像搜索的技术架构及其优势&#xff…

【这些都不知道你就是个弟弟】Docker常用命令

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 程序员欣宸转自 | 企业博客责编 | 阿秃除了基本的docker pull、docker image、docker ps&#xff0c;还有一些命令及参数也很重要&#xff0c;在此记录下来避免遗忘。环境信息以下是本次操作的环境&#xff1a;操作系统&…

rx ajax,ajax_RxJS 中文文档_w3cschool

Rx 对象上有一个 ajax 运算符。const ajax: any;描述它使用以下请求对象创建 Ajax 请求的可观察对象&#xff1a; 网址&#xff0c;标头等或网址字符串。使用 ajax()来获取从 API 返回的响应对象。import { ajax } from rxjs/ajax;import { map, catchError } from rxjs/operat…

php 模数 指数 公钥生成_php实现JWT认证

什么是JWTJWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息&#xff0c;以便于从资源服务器获取资源。比如用在用户登录上。JWT定义了一种用于简洁&#xff0c;自包…

SpringBoot2.x 整合RabbitMQ_消费端

这一篇讲解消费者 文章目录一、依赖配置1. 引入依赖2. 配置文件3. 主配置二、代码Conding2.1. 消费者代码一、依赖配置 1. 引入依赖 <!--springboot整合RabbitMQ依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>sp…

不断迭代,严苛细节,最终性能如何满足? 基于ELK的大数据平台实践分享

摘要&#xff1a; 在2018年Elastic Meetup 南京交流会中&#xff0c;来自云利来科技的涂海波为现场的听众带来了题为《南京云利来基于ELK的大数据平台》的精彩分享。在本次分享中&#xff0c;他首先进行了公司简介&#xff0c;然后介绍了数据分类&#xff0c;包括数据采集及数据…

cmd输入pip报错_pyhon3下pip安装使用教程(win10)

一、前言 pip 是 Python 包管理工具&#xff0c;该工具提供了对Python 包的查找、下载、安装、卸载的功能。官网下载比较慢,只有几k速度&#xff0c;大家如果还没下载python和pip可以到我的网盘下载。目前pip为v20.0.2版&#xff0c;pytho为v3.8.2&#xff0c;有最新版本会随时…

【小白集合】详解服务器内存和显存基础知识

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | Hardy责编 | 阿秃早期内存通过存储器总线和北桥相连&#xff0c;北桥通过前端总线与CPU通信。从Intel Nehalem起&#xff0c;北桥被集成到CPU内部&#xff0c;内存直接通过存储器总线和CPU相连。所以&#xff0c;在AMD采用So…

如何在机器学习项目中使用统计方法的示例

摘要&#xff1a; 在本文中&#xff0c;将通过十个实例介绍在机器学习项目中起关键作用的统计学方法。 统计学和机器学习是两个密切相关的领域。两者的界限有时非常模糊&#xff0c;例如有一些明显属于统计学领域的方法可以很好地处理机器学习项目中的问题。事实上&#xff0c…

云服务器 文件服务,云服务器文件服务

云服务器文件服务 内容精选换一换远程桌面协议(Remote Desktop Protocol&#xff0c;RDP)&#xff0c;是微软提供的多通道的远程登录协议。本节为您介绍如何使用RDP文件远程登录Windows云服务器。从管理控制台下载的RDP文件对应唯一的云服务器&#xff0c;当前RDP文件命名规则为…

(需求实战_03) SpringBoot整合RabbitMQ 关键代码、策略、模式讲解

这篇主讲管控台和测试 文章目录一、管控台配置1. 创建交换机2. 创建队列3. 交换机绑定队列4. 交换机查看绑定关系5. 队列查看绑定关系二、项目准备2.1. 启动测试方法2.2. 清空控制台2.3.一、管控台配置 1. 创建交换机 2. 创建队列 3. 交换机绑定队列 4. 交换机查看绑定关系…

c++ vector 初始化_什么?还不懂c++vector的用法,你凭什么勇气来的!

作者&#xff1a;良知犹存转载授权以及围观&#xff1a;欢迎添加微信公众号&#xff1a;羽林君前言今天继续肝C&#xff0c;一入C深似海。越学越有意思。今天给大家带来一篇cvector的介绍&#xff0c;难以置信这篇文章写了我三天&#xff0c;不过总算整理完毕&#xff0c;现在分…

人工智能有哪些突破

摘要&#xff1a; 本文讲述了在过去一年里人工智能在哪些方面获得了哪些突破。 AI子领域包括&#xff1a;机器学习&#xff08;ML&#xff09;&#xff0c;自然语言处理&#xff08;NLP&#xff09;&#xff0c;深度学习&#xff08;DL&#xff09;&#xff0c;机器人流程自动…

la环球乐园里的机器人_北京环球度假区核心工程完工,你知道这里面都有什么主题景区吗?...

展开全部北京是我国32313133353236313431303231363533e4b893e5b19e31333436316238的首都&#xff0c;这里不仅有丰富的教育、医疗资源&#xff0c;还是我国的政治、经济、文化中心&#xff0c;同时&#xff0c;这里还有我国其他地区没有的旅游资源。北京的欢乐谷闻名全国&#…

默纳克系统服务器怎么改不了参数,默纳克3000参数设置说明

默纳克3000参数设置说明根据现场实际情况&#xff0c;对照厂家图纸正确设置以下参数&#xff1a;正确设置F0-00(0&#xff1a;开环控制&#xff0c;1&#xff1a;闭环控制)F0-01(0&#xff1a;面板控制&#xff0c;1&#xff1a;端子控制)F0-03(电梯最大运行速度)可在F0-04(电梯…

突发!Python再次卫冕,Java和C下降,你怎么看?

2019年转眼已经大半&#xff0c;在近几个月的榜单中&#xff0c;Python已经走上卫冕的道路&#xff0c;并且与Java的差距拉得更远了一些。以往与Java常呈现你追我赶之势&#xff0c;而这一次则是直接相差了近10%&#xff01;Python的火&#xff0c;有目共睹。Python陆续登上了I…

NLP产品级系统设计模式

摘要&#xff1a; 在本文中&#xff0c;作者从六个方面描述了一些生产NLP系统的常见设计和部署模式。这些是团队为了使产品开发与技术、业务、战略和操作目标保持一致而必须做出的选择或权衡。 摘要&#xff1a;在本文中&#xff0c;作者从六个方面描述了一些生产NLP系统的常见…

2个vector如何合成一个_面试中如何做到不卑不亢,牢记2个要点

文│叨叨HR那点事(文章原创&#xff0c;版权归本作者所有&#xff0c;欢迎个人转发分享)面试的时候什么态度和面试官沟通&#xff1f;这个问题&#xff0c;就像一千个人眼里有一千个哈姆雷特一样&#xff0c;人人都有自己的意见和看法。有人说&#xff0c;面试嘛&#xff0c;当…

机器学习到底是什么?

摘要&#xff1a; 机器学习到底是什么东东&#xff1f;了解一下&#xff01; 关于机器学习最简单的定义来自于Berkeley所表述的:机器学习是AI的一个分支&#xff0c;它探索了让计算机根据经验提高效率的方法。 为了更深刻的理解这一定义&#xff0c;接下来我们将对其进行拆分…

修改服务器时间报错,修改服务器时间linux

修改服务器时间linux 内容精选换一换IPv6的使用&#xff0c;可以有效弥补IPv4网络地址资源有限的问题。如果当前云服务器使用IPv4&#xff0c;那么启用IPv6后&#xff0c;云服务器可在双栈模式下运行&#xff0c;即云服务器可以拥有两个不同版本的IP地址&#xff1a;IPv4地址和…