前面写了一篇有关于虚幻4加载第三方库的博客思前顾后,感觉细节还是有必要拎起来注意下.
ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的理解范围了.另外我也不想让我近一个礼拜研究的C++ Socket无用武之地,毅然决然的决定使用自己的C++通讯库.再美再豪华的别墅真不如自己亲手搭建的草庐来的舒畅.这就好比我表弟,要花200块钱玩一个游戏,我说,我有一个1000巅峰的大神号,我不玩了,送你吧,你不要买了.他说:不!我就要自己的号! 他梦幻没钱充点卡了,我说,我的号给你玩吧,满修满猎满技能,锦衣祥瑞无级别...第二天,他依然开着自己的号在东海湾抓大海龟...
不要问我为什么执意要封装成库,我至今都没能摆脱那 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);
}
SocketLibrary.cpp的内容如下:
include "SocketLibrary.h"
#include
#include
#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
OK,把SocketLibrary.dll,SocketLibrary.lib,SocketLibrary.h这三个文件拿出来放到虚幻中.(每次修改这个通讯库,都要重新编译和替换这三个文件)
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"));
}
}