MFC使用AND的OGToolKits中的libOGSocket进行网络通信
目录
一、目的
1、想:MFC使用AND的OGToolKits中的libOGSocket进行网络通信
二、参考
1、
三、操作:服务端
1、效果:
服务端打开后,客户端再打开,客户端会发送一个结构体给服务端,
服务端会接受到这个结构体
1、服务端:创建MySever的MFC工程
1、使用OGToolKits,搭建MFC环境(跳过,网上很多方法)
下载:
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环境(跳过,网上很多方法)
下载:
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;
}