# 网络 ## 基本类型 ### FSocket 代码太多了,直接贴文件路径吧 [TestActor.h文件](./Src/TestSocket/TestActor.h) [TestActor.cpp文件](./Src/TestSocket/TestActor.cpp) 核心代码就两部分 - 对于客户端来说,主要是 连接 和 发送信息 ```cpp ISocketSubsystem* System = ISocketSubsystem::Get(); // 创建地址 Addr = System->CreateInternetAddr(); // 创建 Socket Host = System->CreateSocket(NAME_Stream, TEXT("default"), false); // 绑定 Socket 和 地址 进行连接 Host->Connect(*Addr); // 发送信息 Host->Send((uint8*)TCHAR_TO_UTF8(Data), Size, Send); ``` - 对于服务器来说,主要是 监听 和 收取信息 ```cpp ISocketSubsystem* System = ISocketSubsystem::Get(); Socket = System->CreateSocket(NAME_Stream, TEXT("default"), false); // 绑定 IP 和 端口 Socket->Bind(*Addr); // 监听事件 Socket->Listen(5); while(true) { // 检查是否有待处理的连接 Socket->Wait(ESocketWaitConditions::WaitForRead, FTimespan::FromSeconds(2)); // 接受新连接 ClientSocket = Socket->Accept(TEXT("ClientConnection")); // 接收数据 TArray ReceiveData; ClientSocket->Recv(ReceiveData.GetData(), ReceiveData.Num(), Read); FString ReceivedString = FString(UTF8_TO_TCHAR(reinterpret_cast(ReceiveData.GetData()))); } ``` 这里 `CreateSocket` 的参数是 `NAME_Stream`,除了 `NAME_Stream` 之外还有 `Name_DGram` - `Name_Stream` 是数据流,用于 TCP 连接 - `Name_DGram` 是 `DataGram` 的简写,表示是数据报,用于 UDP 连接 另外 `CreateSocket` 还有第三个参数 `ProtocolType`,有两个属性值 `FNetworkProtocolTypes::IPv4` 和 `FNetworkProtocolTypes::IPv6` 分别对应 IPV4 和 IPV6 两个 `FSocket` 属于网络中最基础的地方,根据不同的平台底层实现不同 比如 `FSocketWindows` 就是用于 Windows 平台的 ### UNetDriver 是一个比较重要的网络管理类,可以简单看下其结构 ## 初始化流程 ### Server 的初始化流程 ![](Image/005.png) 在 `Listen` 函数中会创建 `NetDriver`、`Socket` 并绑定 `InURL` 配置如下,监听接口为 17777 ![](Image/006.png) `Listen` 代码的执行流程如下 ![](Image/007.png) ### Client 的初始化流程 ![](Image/008.png) 默认创建下面这些 `Channel`,都是继承自 `UChannel` 基类,用于表示传递某种类型的信息 | Name | 对象 | | --- | --- | | Control | UControlChannel | | Voice | UVoiceChannel | | DataStream | UDataStreamChannel | | Actor | UActorChannel | ![](Image/009.png)