昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心
前面写了一篇有关于虚幻4加载第三方库的博客思前顾后,感觉细节还是有必要拎起来注意下.
ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的理解范围了.另外我也不想让我近一个礼拜研究的C++ Socket无用武之地,毅然决然的决定使用自己的C++通讯库.再美再豪华的别墅真不如自己亲手搭建的草庐来的舒畅.这就好比我表弟,要花200块钱玩一个游戏,我说,我有一个1000巅峰的大神号,我不玩了,送你吧,你不要买了.他说:不!我就要自己的号! 他梦幻没钱充点卡了,我说,我的号给你玩吧,满修满猎满技能,锦衣祥瑞无级别...第二天,他依然开着自己的号在东海湾抓大海龟...
,不说了,都是泪.
一.创建C++Socket通讯库
不要问我为什么执意要封装成库,我至今都没能摆脱那 DWORD的噩梦.
打开VS,新建空项目,新建SocketLibrary.h和SocketLibrary.cpp这两个文件,还有一个Source.def文件.
SocketLibrary.h的内容如下:
#pragma once
namespace 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);
//关闭Socket
int 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);
}
//关闭Socket
int 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中封装并使用自定义C++Socket库的过程,包括库的创建、编译及在UE4项目中的集成。通过具体步骤说明如何使自定义Socket库与UE4无缝对接。



668

被折叠的 条评论
为什么被折叠?



