C++第三方库HPSocket数据的发送与接收
发送数据
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,略有修改。
C++第三方库HPSocket数据的发送与接收相关推荐
- python socket发送组播数据_python3通过udp实现组播数据的发送和接收操作
本文主要通过对海康摄像头进行抓包,模拟发送了udp包,并抓取摄像头返回的数据包,解析并提取相关信息. 通过抓包发现,海康摄像头发送.接收数据使用udp协议,后来比较发现,使用python模拟起来比较简 ...
- rocket mq 监听端口_如何使用Jmeter实现MQ数据的发送和接收?性能测试实战篇
JMeter是性能测试中被普遍使用的一种工具,常用于压力测试.该工具具有丰富的扩展插件用以满足不同情况下性能测试的需求.消息队列(Message Queue)简称为MQ,作为目前的主流中间件,在很多软 ...
- python获取本地时间并向服务器发送udp报文_python3通过udp实现组播数据的发送和接收操作...
本文主要通过对海康摄像头进行抓包,模拟发送了udp包,并抓取摄像头返回的数据包,解析并提取相关信息. 通过抓包发现,海康摄像头发送.接收数据使用udp协议,后来比较发现,使用python模拟起来比较简 ...
- java串口发送十六进制数,本文实例为大家分享了Java实现串口通信的具体代码,供大家参考,具体内容如下1.介绍使用Java实现的串口通信程序,支持十六进制数据的发送与接收。 源码:...
本文实例为大家分享了Java实现串口通信的具体代码,供大家参考,具体内容如下 1.介绍 使用Java实现的串口通信程序,支持十六进制数据的发送与接收. 源码:SerialPortDemo 效果图如下: ...
- 关于串口数据的发送和接收(调试必备)
前言 对于串口的数据发送和接收,大多是都是利用串口中断来进行的,但是这样对于编程方面有一定要求,并且程序也不太好写,比如说,如果让你随意接收一段数据,然后利用串口将它发送出来,第一个需要考虑的问题就是 ...
- Android Wear开发 - 数据通讯 - 第二节 : 数据的发送与接收
本节由介绍3种数据的发送接收: 1.Data Items : 比特类型数据,限制100KB以内 2.Assets : 资源类型数据,大小无上限 3.Message : 发送消息,触发指令 http:/ ...
- ZigBee组网机制以及数据的发送和接收
Zigbee是一种新型的短距离无线通信技术.其特点是低功耗,低成本,组网灵活.Zigbee协议由zigbee联盟指定,包括应用层,和网络层,其下层采用IEEE802.15.4协议. 无论是学习zigb ...
- java-UDP协议实现数据的发送和接收
实现发送端 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; im ...
- 教学5层网络体系结构——分层之后数据的发送和接收
协议分层后数据发送过程 发送方层层封装 接收方层层解封装 唯一加尾部的是数据链路层 思考 发送方某层封装完如何知道该交给哪个下层封装? 应用层选择传输层由应用程序决定,传输层选择网络层由固定的搭配,例 ...
- 千兆网(2):数据的发送与接收测试
难点: 多时钟的切换 相位偏移的数据同步 原语的使用 RTL结构视图与时钟网络 工程文件的路径: 其中RGMII_tx_ctrl模块为FPGA测试发送数据模块,依赖于仿真 RGMII_tx_ctrl的 ...
最新文章
- 您有一个新的订单mp3在线_Airtable,不仅仅是强大的在线表格应用,而是一个新物种...
- 如何正确配置Nginx+PHP
- java 动态读取文件_Java窗体动态加载磁盘文件的实现方法
- EOS绑定以太坊地址
- JS获取元素属性和自定义属性
- 前端初级html\css知识点总结
- 为Flash Builder/Professional更新Flash Player
- 利用Python下载文件
- 软考:数据库系统工程师
- 魔兽世界修改服务器配置文件,魔兽世界怀旧服出生参数修改和技能学习
- 牛客网经典120道Java面试常见题(试题+答案)
- 极速办公(excel)身份证中的出生日期如何提取
- 荣耀7升级android8,华为+荣耀7款老爷机齐升安卓8.0:最近两年全覆盖
- TCP协议-TCP服务特点和头部结构
- 如果想变强,有我在2
- 264编码 yocto_66AK2H06
- Scala的类型擦除 和 TypeTags、Manifests的用法
- php采集彩票开奖数据
- HTML基础学习笔记合集
- html如何设置文本框透明度,div设置透明度