C++第三方库HPSocket数据的发送与接收
2017-07-27 10:15
791 查看
发送数据
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); //在控件中显示name itoa(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); //在控件中显示age ch = 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,略有修改。
相关文章推荐
- ios socket第三方框架 AsyncSocket使用简介,连接,心跳,断线,数据发送与接收
- android平台通过socket向C++服务器端发送数据和接收数据的相关问题
- android平台通过socket向C++服务器端发送数据和接收数据的相关问题
- Socket —>AsyncSocket(ios socket第三方框架 AsyncSocket使用简介,连接,心跳,断线,数据发送与接收)
- JAVA和C++通过socket发送和接收结构体
- 自己写了个连接socket服务的功能,连接成功后向服务发送数据并接收数据
- 使用Socket类接收和发送数据
- Java中通过TCP协议发送和接收数据-Socket编程
- 纯 java 实现 Http 资源读取工具,支持发送和接收数据,不依赖任何第三方 jar 包
- 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制
- Java网络编程从入门到精通(13):使用Socket类接收和发送数据
- c++与web交互socket该发送的协议数据
- 使用DatagramSocket发送、接收数据(Socket之UDP套接字)
- C#使用Socket发送和接收TCP数据实例
- 使用DatagramSocket发送、接收数据(Socket之UDP套接字)
- Android Socket 发送与接收数据问题: 发送后的数据接收到总是粘包
- Java中通过TCP协议发送和接收数据-Socket编程
- Linux下发送与接收组播数据(socket编程)
- 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制
- 使用DatagramSocket发送、接收数据(Socket之UDP套接字)