C++第三方库HPSocket数据的发送与接收

来源:互联网 发布:网络研修 编辑:程序博客网 时间:2024/05/16 15:39

发送数据

CString bodyDesc;m_Content.GetWindowText(bodyDesc);SendData2("怪兽乐园", 23, bodyDesc);
void CClientDlg::SendData2(LPCSTR bodyName, short bodyAge, CString bodyDesc){static DWORD SEQ = 0;USES_CONVERSION;LPCSTR name = bodyName;LPCSTR desc = T2A((LPCTSTR)bodyDesc);int desc_len = (int)strlen(desc) + 1;int body_len = offsetof(TPkgBody, desc) + desc_len;TPkgBody* pBody = (TPkgBody*)_alloca(body_len);memset(pBody, 0, body_len);pBody->age = bodyAge;strcpy(pBody->name, name);strcpy(pBody->desc, desc);TPkgHeader header;header.seq = ++SEQ;header.body_len = body_len;WSABUF bufs[2];bufs[0].len = sizeof(TPkgHeader);bufs[0].buf = (char*)&header;bufs[1].len = body_len;bufs[1].buf = (char*)pBody;if (m_Client->SendPackets(bufs, 2))  //发送多组数据(2组)::LogSend(m_Client->GetConnectionID(), bodyDesc);else::LogSendFail(m_Client->GetConnectionID(), ::SYS_GetLastError(), ::HP_GetSocketErrorDesc(SE_DATA_SEND));}


接收数据

EnHandleResult CServerDlg::OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength){TPkgInfo* pInfo = FindPkgInfo(pSender, dwConnID);ITcpPullServer* pServer = ITcpPullServer::FromS(pSender);if (pInfo != nullptr){int required = pInfo->length;int remain = iLength;while (remain >= required){remain -= required;CBufferPtr buffer(required);EnFetchResult result = pServer->Fetch(dwConnID, buffer, (int)buffer.Size());if (result == FR_OK){if (pInfo->is_header){TPkgHeader* pHeader = (TPkgHeader*)buffer.Ptr();//TRACE("[Server] head -> seq: %d, body_len: %d\n", pHeader->seq, pHeader->body_len);required = pHeader->body_len;}else{TPkgBody* pBody = (TPkgBody*)(BYTE*)buffer;char *ch = pBody->name;int num = MultiByteToWideChar(0, 0, ch, -1, NULL, 0);//获得长字节所需的空间wchar_t *wide = new wchar_t[num];MultiByteToWideChar(0, 0, ch, -1, wide, num);m_Info.AddString(wide);   //在控件中显示nameitoa(int(pBody->age), ch, 10);   //将int转换为char*num = MultiByteToWideChar(0, 0, ch, -1, NULL, 0);//获得长字节所需的空间wide = new wchar_t[num];MultiByteToWideChar(0, 0, ch, -1, wide, num);m_Info.AddString(wide);  //在控件中显示agech = pBody->desc;num = MultiByteToWideChar(0, 0, ch, -1, NULL, 0);//获得长字节所需的空间wide = new wchar_t[num];MultiByteToWideChar(0, 0, ch, -1, wide, num);m_Info.AddString(wide); //在控件中显示desc//TRACE("[Server] body -> name: %s, age: %d, desc: %s\n", pBody->name, pBody->age, pBody->desc);required = sizeof(TPkgHeader);}pInfo->is_header = !pInfo->is_header;pInfo->length = required;::PostOnReceive(dwConnID, buffer, (int)buffer.Size());if (!pSender->Send(dwConnID, buffer, (int)buffer.Size()))  //发送数据return HR_ERROR;}}}return HR_OK;}
TPkgInfo* CServerDlg::FindPkgInfo(ITcpServer* pSender, CONNID dwConnID){ PVOID pInfo = nullptr;
 pSender->GetConnectionExtra(dwConnID, &pInfo); //获取连接的附件数据
 return (TPkgInfo*)pInfo;}

自定义类型

struct TPkgHeader {DWORD seq;int body_len;};struct TPkgBody {char name[30];  short age;   char desc[1];};
struct TPkgInfo{ bool is_header; int length;
 TPkgInfo(bool header = true, int len = sizeof(TPkgHeader)) : is_header(header), length(len) {} void Reset() {is_header = true, length = sizeof(TPkgHeader);} ~TPkgInfo() {}};

代码源自HPSocket的demo,略有修改。


阅读全文
0 0