UE4 Socket多线程非阻塞通信【1】

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lunweiwangxi3/article/details/50468593

昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心

手机淘宝二维码 扫描      

或者打开连接:程序设计开发 ,掌声鼓励,欢迎光临.


 

 

前面写了一篇有关于虚幻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"));     
	}
}


这样,就能使用通讯库了.

第一部分完...




展开阅读全文

没有更多推荐了,返回首页