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

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

目录


一、目的

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

二、参考

1、

三、操作:服务端

1、效果:

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

www.zeeklog.com  - MFC使用AND的OGToolKits中的libOGSocket进行网络通信

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

www.zeeklog.com  - MFC使用AND的OGToolKits中的libOGSocket进行网络通信

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;
}