MFC使用AND的OGToolKits中的libOGSocket进行网络通信

47 篇文章 2 订阅

目录

一、目的

1、想:MFC使用AND的OGToolKits中的libOGSocket进行网络通信

二、参考

1、

三、操作:服务端

1、效果:

1、服务端:创建MySever的MFC工程

1、使用OGToolKits,搭建MFC环境(跳过,网上很多方法)

1、MySeverDlg.h

1、MySeverDlg.cpp

三、操作:客户端:

1、创建:MyClient的MFC工程

1、使用OGToolKits,搭建MFC环境(跳过,网上很多方法)

1、MyClientDlg.h:和MySeverDlg.h类似

1、MyClientDlg.cpp


 

一、目的

1、想:MFC使用AND的OGToolKits中的libOGSocket进行网络通信

 

二、参考

1、

 

三、操作:服务端

1、效果:

服务端打开后,客户端再打开,客户端会发送一个结构体给服务端,

服务端会接受到这个结构体

 

1、服务端:创建MySever的MFC工程

1、使用OGToolKits,搭建MFC环境(跳过,网上很多方法)

下载:https://download.csdn.net/download/qq_40544338/11923325

1、MySeverDlg.h

头文件和命名空间

#include "libOGSocket.h"

#include <vector>
using namespace std;

初始化socket

	//socket
public:
	bool Init_socket();

1、MySeverDlg.cpp

在程序最上面开始编写

std::vector<OG_CLIENT>  ogClient;

#pragma pack(1)  //设置结构体的边界对齐为1个字节,也就是所有du数据在内存中zhi是连续存储的。
struct MyStruct
{
	int a;
	char pName[MAX_PATH];
};
#pragma pack(1)

void * pServer = NULL;
int  port;//端口号

//十六进制字符串转化为ASSIC字符串:串口转换内容时候使用到
static int Hex2String(char* lpSrc, int len, char* lpDst, char chTag = ' ')
{
	int ret = 0;
	char buf[2];
	unsigned char* pSrc = (unsigned char*)lpSrc;
	for (int i = 0; i < len; i++)
	{
		unsigned char c0 = *pSrc >> 4;
		if (c0 >= 0x0 && c0 <= 0x9)
		{
			buf[0] = c0 - 0 + '0';
		}
		else {
			buf[0] = c0 - 10 + 'A';
		}
		unsigned char c1 = *pSrc++ & 0x0F;
		if (c1 >= 0x0 && c1 <= 0x9)
		{
			buf[1] = c1 - 0 + '0';
		}
		else {
			buf[1] = c1 - 10 + 'A';
		}
		*lpDst++ = buf[0];
		ret++;
		*lpDst++ = buf[1];
		ret++;
		if (0 != chTag)
		{
			*lpDst++ = chTag;
			ret++;
		}
	}

	return ret;
}


// 回调函数原型(在程序中实现函数功能)
// 服务器检测到客户端连接触发
// 客户端检测到连接服务器成功触发
void LPCONNECT(unsigned int sock)
{
	OG_CLIENT client;
	ZeroMemory(&client, sizeof(OG_CLIENT));
	ogClient.push_back(client);
}
// 服务器检测到客户端连接断开触发
// 客户端检测到服务器关闭触发
void  LPDISCONNECT(unsigned int sock)
{
	for (unsigned int i = 0; i < ogClient.size(); i++)
	{
		if (ogClient[i].sock == sock)
		{
			ogClient.erase(ogClient.begin() + i);
			i--;
		}
	}
}
// 先接收后发送过程
// cRecv传入时为接收到的数据|回调中为cSend填充要发送的数据
// 返回实际发送的字节数
// 如接收数据后不需要再发送响应数据回调中设返回值为0且不为cSend拷贝数据
unsigned int LPPROC(unsigned int sock, char* cRecv, char* cSend)
{
	//第一步:接受客户端发送来的消息
	//测试0:输出char* cRecv的内容====================
	//a:完成将传递来的char* cRecv16进制转换为string将其输出
	char  tmpC[MAX_PATH];
	Hex2String(cRecv, 2, tmpC);

	TRACE("\n接收到的消息:");
	TRACE(tmpC);
	TRACE("\n");

	//测试1:将cRecv变为MyStruct结构体==========================
	//结果:成功
	MyStruct *	tmpMyStruct = (MyStruct *)(cRecv);

	//第二步:向客户端发送消息
	MyStruct pData;
	ZeroMemory(&pData, sizeof(MyStruct));
	ogTcpSocketSendData(pServer, sock, (char*)(&pData), sizeof(MyStruct));

	return 0;
}

初始化socket

bool CMySeverDlg::Init_socket()
{	
	port = 8666;

	//ipaddr:没内容的是程序做服务端;有内容是程序做客户端连接服务端
	pServer = ogOpenTcpSocket("", port, sizeof(MyStruct), sizeof(MyStruct), LPPROC, LPCONNECT, LPDISCONNECT);

	if (pServer== nullptr)
	{
		AfxMessageBox(L"没有打开网络!");
	}
	else
	{

	}

	return true;
}

 

三、操作:客户端:

1、创建:MyClient的MFC工程

1、使用OGToolKits,搭建MFC环境(跳过,网上很多方法)

下载:https://download.csdn.net/download/qq_40544338/11923325

1、MyClientDlg.h:和MySeverDlg.h类似

头文件

#include "vector"

#include "libOGSocket.h"

#include <vector>
using namespace std;

 初始化socket

	//socket
public:
	bool Init_socket();

1、MyClientDlg.cpp

写在最上面

std::vector<OG_CLIENT>  ogClient;

#pragma pack(1)
struct MyStruct
{
	int a;
	char pName[MAX_PATH];
};
#pragma pack(1)

void * pServer = NULL;
int  port;

// 回调函数原型(在程序中实现函数功能)
// 服务器检测到客户端连接触发
// 客户端检测到连接服务器成功触发
void LPCONNECT(unsigned int sock)
{
	OG_CLIENT client;
	ZeroMemory(&client, sizeof(OG_CLIENT));
	ogClient.push_back(client);

	//发送
	MyStruct pData;
	ZeroMemory(&pData, sizeof(MyStruct));
	pData.a = 3;
	sprintf_s(pData.pName, "asd");
	ogTcpSocketSendData(pServer, sock, (char*)(&pData), sizeof(MyStruct));
}
// 服务器检测到客户端连接断开触发
// 客户端检测到服务器关闭触发
void  LPDISCONNECT(unsigned int sock)
{
	for (unsigned int i = 0; i < ogClient.size(); i++)
	{
		if (ogClient[i].sock == sock)
		{
			ogClient.erase(ogClient.begin() + i);
			i--;
		}
	}
}
// 先接收后发送过程
// cRecv传入时为接收到的数据|回调中为cSend填充要发送的数据
// 返回实际发送的字节数
// 如接收数据后不需要再发送响应数据回调中设返回值为0且不为cSend拷贝数据
unsigned int LPPROC(unsigned int sock, char* cRecv, char* cSend)
{
	TRACE(cRecv);
	TRACE("接收到的消息/n");

	发送
	//MyStruct pData;
	//ZeroMemory(&pData, sizeof(MyStruct));
	//ogTcpSocketSendData(pServer, sock, (char*)(&pData), sizeof(MyStruct));

	return 0;
}

 

bool CMyClientDlg::Init_socket()
{
	port = 8666;

	//ipaddr:没内容的是程序做服务端;有内容是程序做客户端连接服务端
	pServer = ogOpenTcpSocket("162.16.1.216", port, sizeof(MyStruct), sizeof(MyStruct), LPPROC, LPCONNECT, LPDISCONNECT);

	if (pServer == nullptr)
	{
		AfxMessageBox(L"没有打开网络!");
	}
	else
	{

	}

	return true;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值