UE4 Socket多线程非阻塞通信【1】
昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心
前面写了一篇有关于虚幻4加载第三方库的博客思前顾后,感觉细节还是有必要拎起来注意下.
ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的理解范围了.另外我也不想让我近一个礼拜研究的C++ Socket无用武之地,毅然决然的决定使用自己的C++通讯库.再美再豪华的别墅真不如自己亲手搭建的草庐来的舒畅.这就好比我表弟,要花200块钱玩一个游戏,我说,我有一个1000巅峰的大神号,我不玩了,送你吧,你不要买了.他说:不!我就要自己的号! 他梦幻没钱充点卡了,我说,我的号给你玩吧,满修满猎满技能,锦衣祥瑞无级别...第二天,他依然开着自己的号在东海湾抓大海龟...
,不说了,都是泪.
一.创建C++Socket通讯库
不要问我为什么执意要封装成库,我至今都没能摆脱那 DWORD的噩梦.
打开VS,新建空项目,新建SocketLibrary.h和SocketLibrary.cpp这两个文件,还有一个Source.def文件.
SocketLibrary.h的内容如下:
#pragma oncenamespace YJ
{//创建并且连接到服务器(in_IP地址,in_端口号,out_Socket)int CreateAndConnect(char IPAddress[256], int Htons, void*& Socket);//设置Socket为非阻塞模式;返回0:成功int Ioctlsocket(void* socket);//接收消息(in_Socket,in_数据,in_长度,in_标志位(默认0));返回实际接收到的消息长度int ReceiveMSG(void* Socket, char* Data, int Num, int Flags = 0);//发送消息(in_Socket,in_数据,in_长度,in_标志位(默认0));返回实际发出去的消息长度int SendMSG(void* Socket, char* Data, int Num, int Flags = 0);//关闭Socketint CloseSocket(void* Socket);
}
<span style="color:#009900;"><u>SocketLibrary.cpp的内容如下:</u></span>
include "SocketLibrary.h"
#include <iostream>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;namespace YJ
{//创建并且连接到服务器(in_IP地址,in_端口号,out_Socket)int CreateAndConnect(char IPAddress[256], int Htons, void*& Socket){WSADATA Data;SOCKADDR_IN DestSockAddress;unsigned long DestAddress;//创建套接字(采用流式套接字)WSAStartup(MAKEWORD(1, 1), &Data);DestAddress = inet_addr(IPAddress);memcpy(&DestSockAddress.sin_addr, &DestAddress, sizeof(DestAddress));DestSockAddress.sin_port = htons(Htons);DestSockAddress.sin_family = AF_INET; //指定地址协议族//构造socket(服务器端:构造监听流式SOCKET;客户端:构造通讯流式SOCKET)Socket = (void*)socket(AF_INET, SOCK_STREAM, 0);//连接return connect((SOCKET)Socket, (LPSOCKADDR)&DestSockAddress, sizeof(DestSockAddress));}//接收消息(in_Socket,in_数据,in_长度,in_标志位(默认0));返回实际接收到的消息长度int ReceiveMSG(void* Socket, char* Data, int Num, int Flags /*= 0*/){return recv((SOCKET)Socket, Data, Num, Flags);}//发送消息(in_Socket,in_数据,in_长度,in_标志位(默认0));返回实际发出去的消息长度int SendMSG(void* Socket, char* Data, int Num, int Flags /*= 0*/){return send((SOCKET)Socket, Data, Num, Flags);}//关闭Socketint CloseSocket(void* Socket){return closesocket((SOCKET)Socket);}//设置Socket为非阻塞模式;返回0:成功int Ioctlsocket(void* socket){int iMode = 1; //0:阻塞return ioctlsocket((SOCKET)socket, FIONBIO, (u_long FAR*)&iMode);}}
Source.def的内容如下:
LIBRARY SocketLibrary
EXPORTS
CreateAndConnect
Ioctlsocket
ReceiveMSG
SendMSG
CloseSocket
配置好,这里我虚幻是准备打包64位的,所以我的库就要编译64位的:
OK,把SocketLibrary.dll,SocketLibrary.lib,SocketLibrary.h这三个文件拿出来放到虚幻中.(每次修改这个通讯库,都要重新编译和替换这三个文件)
--SocketLibrary.dll放到虚幻项目的Binaries>Win64里面(.dll文件要和EXE文件放在一起)
--在虚幻项目根目录下新建一个SocketLib文件夹:
--打开SocketLib这个文件夹,再新建两个文件夹:Include,Lib. 头文件.h和库文件.lib对号入座拷贝到相应目录下:
然后打开虚幻项目 : 项目名.sln; 打开:项目名.Build.cs文件:
Fill out your copyright notice in the Description page of Project Settings.
using UnrealBuildTool;
using System.IO; //1.添加引用文件public class Text_work_10_27 : ModuleRules
{private string ModulePath{get { return Path.GetDirectoryName(RulesCompiler.GetModuleFilename(this.GetType().Name)); }}private string ThirdPartyPath{get { return Path.GetFullPath(Path.Combine(ModulePath, "../../SocketLib/")); }}public Text_work_10_27(TargetInfo Target){PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });PrivateDependencyModuleNames.AddRange(new string[] { });//2.添加Socket通讯库头文件目录和库目录PublicIncludePaths.Add(Path.Combine(ThirdPartyPath, "Include"));PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "Lib", "SocketLibrary.lib")); }
}
这样,就能使用通讯库了.
第一部分完...
UE4 Socket多线程非阻塞通信【1】相关推荐
- UE4 Socket多线程非阻塞通信【2】
昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心 紧接着第一部分,别说话,勿打断我游离的思绪我们走我们走... 二.消息结构&收发队列 先不急着往下走,先捋一捋,不知道自己要干什么地走下去是一件 ...
- 基于MFC的socket编程(异步非阻塞通信)
对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清,只知其 ...
- Socket 实现非阻塞式多线程文件传输(jpg mov 等各种格式)
Socket 基础 非阻塞式TCP socket 实现文件传输, 实测 传输5M的jpg , 30M的 NEF(单反原图) 以及 1G以上的mov文件,均正常接收 客户端可多开,服务器多线程实现服务器 ...
- 用Java实现非阻塞通信
用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式.这些服务器程序或客户程序在运行过程中常常会阻塞.例如当一个线程执行ServerSocket的acc ...
- 《BIO、NIO、AIO非阻塞通信实例》
<BIO.NIO.AIO非阻塞通信实例> NIO与阻塞式通信区别 NIO通信IO工作方式原理 AIO通信编程 AIO服务端创建过程 AIO客户端创建过程 NIO通信编程 Reactor模型 ...
- python3socket非阻塞_利用Python中SocketServer 实现客户端与服务器间非阻塞通信
利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信. 首先,先了解下SocketServer模块中可供使用的类: BaseServer:包含服务器的核心功能与混合(mix-in ...
- [Python]再学 socket 之非阻塞 Server
再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...
- java网络编程阻塞_Java网络编程由浅入深三 一文了解非阻塞通信的图文代码示例详解...
本文详细介绍组成非阻塞通信的几大类:Buffer.Channel.Selector.SelectionKey 非阻塞通信的流程ServerSocketChannel通过open方法获取ServerSo ...
- pythontcp服务器如何关闭阻塞_利用Python中SocketServer 实现客户端与服务器间非阻塞通信...
利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信. 首先,先了解下SocketServer模块中可供使用的类: BaseServer:包含服务器的核心功能与混合(mix-in ...
最新文章
- C++ Primer 5th笔记(2)chapter 2变量和基本类型:引用、const
- java 增量,Java增量运算符查询(++ i和i ++)
- 合成孔径成像算法与实现_浅析太赫兹成像技术在消防领域中的应用前景
- PMP知识点(三、范围管理)
- 【NLP】Pytorch中文语言模型bert预训练代码
- Http Handler 介绍(转)
- Openstack 与VMware 不同CPU迁移原理
- 第 190 场力扣周赛
- C语言学习笔记---浮点函数modf()和fmod()
- 【C++leetcode】寻找给定字符串的最大回文子串
- Node.js:Express
- 家庭洗车APP --- Androidclient开展 之 网络框架包介绍(一)
- 中英文停用词(stop word)列表
- Android开源项目第一篇——个性化控件(View)篇
- 数据结构 09-链表概念及常见链表结构
- [学习日志]UI如何与数据绑定?
- DNS服务器存在问题需要修复,dns服务(dns异常怎么都修复不了)
- 菜鸟Axios学习=官网
- 校园网免认证利用IPV6轻松绕过校园WiFi网关
- 数据库设计之网上书店系统
热门文章
- 橡胶支座抗压弹性模量计算公式_(完整版)橡胶支座计算
- 开关电源32个检测项目、检测方法与检测设备(上)
- 不管过去如何,未来我们都要奋力前行!
- 【无标题】No qualifying bean of type ‘javax.sql.DataSource‘ available: expected at least 1
- 杂谈 | 从刘慈欣科幻小说到元宇宙
- 焊接过程计算机模拟研究,焊接过程的数值模拟
- 压缩软件推荐(bandizip)
- java最大值最小值_java算法-最大值、最小值
- 小程序,公众号微信客服消息开发
- 谈谈对于百度春晚战事的看法