HP-Socket精简示例
HP-Socket是一个免费开源的通信库。示例代码看起来比较纷繁,所以简化了一下,写了一个demo.
服务器端:
//调试模式请包含HPSocket4C_UD.lib//在工程目录中,包含头件HPSocket4C.h、HPTypeDef.h、SocketInterface.h#pragmaonce#include"HPSocket4C.h"constLPCTSTRDEF_ADDRESS=_T("0.0.0.0");constUSHORTPORT=9700;classServer{public:Server();~Server();HP_TcpPullServerm_pServer;//创建服务器HP_TcpPullServerListenerm_pListener;//监听器private://回调函数staticEn_HP_HandleResult__stdcallOnPrepareListen(HP_ServerpSender,SOCKETsoListen);staticEn_HP_HandleResult__stdcallOnAccept(HP_ServerpSender,HP_CONNIDdwConnID,SOCKETsoClient);staticEn_HP_HandleResult__stdcallOnSend(HP_ServerpSender,HP_CONNIDdwConnID,constBYTE*pData,intiLength);staticEn_HP_HandleResult__stdcallOnReceive(HP_ServerpSender,HP_CONNIDdwConnID,intiLength);staticEn_HP_HandleResult__stdcallOnClose(HP_ServerpSender,HP_CONNIDdwConnID,En_HP_SocketOperationenOperation,intiErrorCode);staticEn_HP_HandleResult__stdcallOnShutdown(HP_ServerpSender);public:VOIDStartServer();VOIDStopServer();private:staticBOOLm_ServerStat;};
.CPP文件
#include"stdafx.h"#include"Server.h"BOOLServer::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_HandleResultServer::OnPrepareListen(HP_ServerpSender,SOCKETsoListen){setlocale(LC_ALL,"chs");TCHARszAddress[50];intiAddressLen=sizeof(szAddress)/sizeof(TCHAR);USHORTusPort;::HP_Server_GetListenAddress(pSender,szAddress,&iAddressLen,&usPort);returnHR_OK;}En_HP_HandleResultServer::OnAccept(HP_ServerpSender,HP_CONNIDdwConnID,SOCKETsoClient){BOOLbPass=TRUE;TCHARszAddress[50];intiAddressLen=sizeof(szAddress)/sizeof(TCHAR);USHORTusPort;::HP_Server_GetRemoteAddress(pSender,dwConnID,szAddress,&iAddressLen,&usPort);USES_CONVERSION;charbuff[255]={};sprintf_s(buff,255,"地址%s:%ld",W2A(szAddress),usPort);returnHR_OK;}En_HP_HandleResultServer::OnSend(HP_ServerpSender,HP_CONNIDdwConnID,constBYTE*pData,intiLength){returnHR_OK;}En_HP_HandleResultServer::OnReceive(HP_ServerpSender,HP_CONNIDdwConnID,intiLength){returnHR_OK;}En_HP_HandleResultServer::OnClose(HP_ServerpSender,HP_CONNIDdwConnID,En_HP_SocketOperationenOperation,intiErrorCode){returnHR_OK;}En_HP_HandleResultServer::OnShutdown(HP_ServerpSender){returnHR_OK;}VOIDServer::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;}}VOIDServer::StopServer(){//停止服务器::HP_Server_Stop(m_pServer);m_ServerStat=FALSE;}
客户端:
CHpClientDlg::CHpClientDlg(CWnd*pParent/*=NULL*/):CDialogEx(IDD_HPCLIENT_DIALOG,pParent){//初始化m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);//创建监听器对象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);}
连接服务器:
voidCHpClientDlg::OnBnClickedButton2(){if(::HP_Client_Start(m_pClient,DEFAULT_ADDRESS,DEFAULT_PORT,true)){m_edShow->SetSel(-1,-1);//插入光标放于最后m_edShow->ReplaceSel(_T("连接成功!"));m_edShow->ScrollWindow(0,0);//滚动到插入点}else{CStringstr;str.Format(_T("%d,%s"),::HP_Client_GetLastError(m_pClient),HP_Client_GetLastErrorDesc(m_pClient));m_edShow->SetSel(-1,-1);//插入光标放于最后m_edShow->ReplaceSel(str);m_edShow->ScrollWindow(0,0);//滚动到插入点}}
准备回调函数(固定写法):
En_HP_HandleResultCHpClientDlg::OnConnect(HP_ClientpSender,HP_CONNIDdwConnID){TCHARszAddress[50];intiAddressLen=sizeof(szAddress)/sizeof(TCHAR);USHORTusPort;::HP_Client_GetLocalAddress(pSender,szAddress,&iAddressLen,&usPort);returnHR_OK;}En_HP_HandleResultCHpClientDlg::OnSend(HP_ClientpSender,HP_CONNIDdwConnID,constBYTE*pData,intiLength){returnHR_OK;}En_HP_HandleResultCHpClientDlg::OnReceive(HP_ClientpSender,HP_CONNIDdwConnID,intiLength){bytebuffer[1000]{0};En_HP_FetchResultresult=::HP_TcpPullClient_Fetch(pSender,buffer,1000);returnHR_OK;}En_HP_HandleResultCHpClientDlg::OnClose(HP_ClientpSender,HP_CONNIDdwConnID,En_HP_SocketOperationenOperation,intiErrorCode){returnHR_OK;}
发送数据:
voidCHpClientDlg::OnBnClickedButton1(){//发送数据CStringstrSend;m_edSend->GetWindowText(strSend);USES_CONVERSION;char*p=W2A(strSend);if(::HP_Client_Send(m_pClient,(BYTE*)p,strlen(p)+1)){CStringstrinfo;strinfo.Format(_T("%d-%s"),::HP_Client_GetConnectionID(m_pClient),strSend);m_edShow->SetSel(-1,-1);//插入光标放于最后m_edShow->ReplaceSel(_T("\r\n发送成功!"));m_edShow->ScrollWindow(0,0);//滚动到插入点}else;//::LogSendFail(::HP_Client_GetConnectionID(m_pClient),::SYS_GetLastError(),::HP_GetSocketErrorDesc(SE_DATA_SEND));}
关闭连接:
voidCHpClientDlg::OnBnClickedButton3(){if(::HP_Client_Stop(m_pClient));//记录客户端(::HP_Client_GetConnectionID(m_pClient));elseASSERT(FALSE);}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。