当前位置: 首页 > 工具软件 > HP-Socket > 使用案例 >

HP-SOCKET 使用C方法-Pull

韩瀚
2023-12-01

包含Windows\Include\HPSocket头文件

HPSocket4C_U.lib、HPSocket4C_UD.lib 库文件

1、服务器:

(1)Server.h

#pragma once

#include "HPSocket4C.h"

const   LPCTSTR   DEF_ADDRESS = _T("0.0.0.0");
const   USHORT    PORT = 9700;

class Server
{
public:
    Server();
    ~Server();

    HP_TcpPullServer         m_pServer;  //创建服务器
    HP_TcpPullServerListener m_pListener;//监听器

private:
    //回调函数
    static En_HP_HandleResult __stdcall OnPrepareListen(HP_Server pSender, SOCKET soListen);
    static En_HP_HandleResult __stdcall OnAccept(HP_Server pSender, HP_CONNID dwConnID, SOCKET soClient);
    static En_HP_HandleResult __stdcall OnSend(HP_Server pSender, HP_CONNID dwConnID, const BYTE* pData, int iLength);
    static En_HP_HandleResult __stdcall OnReceive(HP_Server pSender, HP_CONNID dwConnID, int iLength);
    static En_HP_HandleResult __stdcall OnClose(HP_Server pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode);
    static En_HP_HandleResult __stdcall OnShutdown(HP_Server pSender);
public:
    VOID  StartServer();
    VOID  StopServer();
private:
    static BOOL  m_ServerStat;
};
 

(2)Server.cpp

#include "stdafx.h"
#include "Server.h"
#include <locale.h>

BOOL    Server::m_ServerStat = FALSE;
Server::Server()
{
    // 创建监听器对象
    m_pListener = ::Create_HP_TcpPullServerListener();
    // 创建 Socket 对象
    m_pServer = ::Create_HP_TcpPullServer(m_pListener);
    // 设置 Socket 监听器回调函数
    ::HP_Set_FN_Server_OnPrepareListen(m_pListener, OnPrepareListen);
    ::HP_Set_FN_Server_OnAccept(m_pListener, OnAccept);
    ::HP_Set_FN_Server_OnSend(m_pListener, OnSend);
    ::HP_Set_FN_Server_OnPullReceive(m_pListener, OnReceive);
    ::HP_Set_FN_Server_OnClose(m_pListener, OnClose);
    ::HP_Set_FN_Server_OnShutdown(m_pListener, OnShutdown);
}

Server::~Server()
{
    // 销毁 Socket 对象
    ::Destroy_HP_TcpPullServer(m_pServer);
    // 销毁监听器对象
    ::Destroy_HP_TcpPullServerListener(m_pListener);
}

En_HP_HandleResult Server::OnPrepareListen(HP_Server pSender, SOCKET soListen)
{
    setlocale(LC_ALL, "chs");
    TCHAR szAddress[50];
    int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
    USHORT usPort;

    ::HP_Server_GetListenAddress(pSender, szAddress, &iAddressLen, &usPort);

    return HR_OK;
}

En_HP_HandleResult Server::OnAccept(HP_Server pSender, HP_CONNID dwConnID, SOCKET soClient)
{
    BOOL bPass = TRUE;
    TCHAR szAddress[50];
    int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
    USHORT usPort;

    ::HP_Server_GetRemoteAddress(pSender, dwConnID, szAddress, &iAddressLen, &usPort);

    USES_CONVERSION;
    char buff[255] = {};
    sprintf_s(buff, 255, "地址%s:%ld", W2A(szAddress), usPort);

    return HR_OK;
}

En_HP_HandleResult Server::OnSend(HP_Server pSender, HP_CONNID dwConnID, const BYTE* pData, int iLength)
{
    return HR_OK;
}

En_HP_HandleResult Server::OnReceive(HP_Server pSender, HP_CONNID dwConnID, int iLength)
{
    byte *byBuffer = new byte[iLength];
    En_HP_FetchResult result = ::HP_TcpPullServer_Fetch(pSender, dwConnID, byBuffer, iLength);

    delete[] byBuffer;
    byBuffer = nullptr;

    return HR_OK;
}

En_HP_HandleResult Server::OnClose(HP_Server pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode)
{
    return HR_OK;
}

En_HP_HandleResult Server::OnShutdown(HP_Server pSender)
{
    return HR_OK;
}

VOID Server::StartServer()
{//启动服务器
    USES_CONVERSION;
    if (!::HP_Server_Start(m_pServer, DEF_ADDRESS, PORT))
    {
        m_ServerStat = FALSE;
        printf("服务器启动出错:%d,%s", ::HP_Server_GetLastError(m_pServer), W2A(::HP_Server_GetLastErrorDesc(m_pServer)));
    }
    else
    {
        m_ServerStat = TRUE;
    }
}

VOID Server::StopServer()
{//停止服务器
    ::HP_Server_Stop(m_pServer);
    m_ServerStat = FALSE;
}

服务器调用:

//启动

_Server.StartServer();

//停止

_Server.StopServer();

2、客户端

(1)CDemo1Dlg.h

HP_TcpPullClient         m_pClient;  //创建服务器
    HP_TcpPullClientListener m_pListener;//监听器

private:
    static  En_HP_HandleResult __stdcall OnConnect(HP_Client pSender, HP_CONNID dwConnID);
    static  En_HP_HandleResult __stdcall OnSend(HP_Client pSender, HP_CONNID dwConnID, const BYTE* pData, int iLength);
    static  En_HP_HandleResult __stdcall OnReceive(HP_Client pSender, HP_CONNID dwConnID, int iLength);
    static  En_HP_HandleResult __stdcall OnClose(HP_Client pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode);
 

(2)CDemo1Dlg.cpp

//初始化

{

// 创建监听器对象
    m_pListener = ::Create_HP_TcpPullClientListener();
    // 创建 Socket 对象
    m_pClient = ::Create_HP_TcpPullClient(m_pListener);
    // 设置 Socket 监听器回调函数
    ::HP_Set_FN_Client_OnConnect(m_pListener, OnConnect);
    ::HP_Set_FN_Client_OnSend(m_pListener, OnSend);
    ::HP_Set_FN_Client_OnPullReceive(m_pListener, OnReceive);
    ::HP_Set_FN_Client_OnClose(m_pListener, OnClose);

}

//销毁

if (::HP_Client_Stop(m_pClient))
    {

    }
    else
    {
    }

::Destroy_HP_TcpPullClientListener(m_pListener);


En_HP_HandleResult CDemo1Dlg::OnConnect(HP_Client pSender, HP_CONNID dwConnID)
{
    TCHAR szAddress[50];
    int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
    USHORT usPort;

    ::HP_Client_GetLocalAddress(pSender, szAddress, &iAddressLen, &usPort);

    return HR_OK;
}

En_HP_HandleResult CDemo1Dlg::OnSend(HP_Client pSender, HP_CONNID dwConnID, const BYTE* pData, int iLength)
{
    return HR_OK;
}

En_HP_HandleResult CDemo1Dlg::OnReceive(HP_Client pSender, HP_CONNID dwConnID, int iLength)
{
    byte buffer[1000]{ 0 };
    En_HP_FetchResult result = ::HP_TcpPullClient_Fetch(pSender, buffer, 1000);

    return HR_OK;
}

En_HP_HandleResult CDemo1Dlg::OnClose(HP_Client pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode)
{
    return HR_OK;
}

//连接服务器
void CDemo1Dlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    if (::HP_Client_Start(m_pClient, L"127.0.0.1", 9700, true))
    {
        int yyy = 66;
    }
    else
    {
        int yyy = 55;
    }
}

//发送消息
void CDemo1Dlg::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码

    CString  strSend = L"12345678";
    USES_CONVERSION;
    char * p = W2A(strSend);
    if (::HP_Client_Send(m_pClient, (BYTE*)p, strlen(p) + 1))
    {
        CString  strinfo;
        strinfo.Format(_T("%d-%s"), ::HP_Client_GetConnectionID(m_pClient), strSend);
        int yyy = 55;
    }
}

 类似资料: