
MFC使用AND的OGToolKits中的libOGSocket进行网络通信
发布日期:2021-05-07 00:35:23
浏览次数:22
分类:精选文章
本文共 3994 字,大约阅读时间需要 13 分钟。
目录
一、目的
1、想:MFC使用AND的OGToolKits中的libOGSocket进行网络通信
二、参考
1、
三、操作:服务端
1、效果:
服务端打开后,客户端再打开,客户端会发送一个结构体给服务端,
服务端会接受到这个结构体
1、服务端:创建MySever的MFC工程
1、使用OGToolKits,搭建MFC环境(跳过,网上很多方法)
下载:
1、MySeverDlg.h
头文件和命名空间
#include "libOGSocket.h"#includeusing namespace std;
初始化socket
//socketpublic: bool Init_socket();
1、MySeverDlg.cpp
在程序最上面开始编写
std::vectorogClient;#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"#includeusing namespace std;
初始化socket
//socketpublic: bool Init_socket();
1、MyClientDlg.cpp
写在最上面
std::vectorogClient;#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;}
发表评论
最新留言
不错!
[***.144.177.141]2025年04月08日 01时39分37秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
组合模式
2021-05-09
php调用java类文件
2021-05-09
PyQt5之音乐播放器
2021-05-09
一行python代码搞定文件分享
2021-05-09
css居中方法与双飞翼布局
2021-05-09
Redis进阶实践之十八 使用管道模式提高Redis查询的速度
2021-05-09
Quartz.NET快速入门指南
2021-05-09
多指灵巧手MoveIt!与Gazebo联合仿真框架搭建
2021-05-09