已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+Builder下三种UDP通信实现方法的比较出处主要讨论一下数据的接受:1.NMUDP控件这个控件使用起来比较简单,设定监听端口,然后响应DataReceived事件就可以了,例如:void_fastcallTMoniter:NMUDPDataReceived(TComponent*Sender,intNumberBytes,AnsiStringFromIP,intPort)/*用一个标志变量控制控件受信后是否执行需要的操作*/if(recvFlag)intrl;/*用于接受数据的内存*/unsignedcharrbuf1024*9;/*控件的ReadBuffer方法,把接受到的数据存储到rbuf*/NMUDP-ReadBuffer(rbuf,sizeof(rbuf),rl);/*字符串结束*/rbufrl=0;/*stream是事先定义的文件指针*/if(stream!=NULL)/*自编doLog函数,把接收数据写入日志文件*/doLog(false,rbuf,rl;这个控件的优点是使用简单、效率比较高,但是只支持2K的缓冲,所以上面开辟的9K内存是多余的。2K的限制使我在项目中不得不放弃了这个控件。2.IdUDPServer控件使用方法跟NMUDP差不多,响应UDPRead事件就可以了,例如:(注释参考1)void_fastcallTMoniter:IdUDPServer1UDPRead(TObject*Sender,TStream*AData,TIdSocketHandle*ABinding)if(recvFlag)intr1;unsignedcharrbuf1024*9;r1=AData-Size;/*接受到的数据是存放在数据流AData中的,把它们读到rbuf里去*/AData-Read(rbuf,r1);rbufr1=0;if(stream!=NULL)doLog(false,rbuf,r1);这个控件支持了9K的缓冲,但是效率我需要1秒钟接收150个1K多的数据包并解码后逐行显示在StringGrid中,虽然主要是对StringGrid的描绘浪费时间,但IdUDPServer还是不能令人满意。3.回归自然吧Socket两个控件都不能满足我的需要,那么只能回头考虑底层的socket(我的C不好,对这个方法现在还不是很明白,所以注释很少,不过通过代码能大约猜出其功能)。先定义这三个东东:SOCKETsockWSADATAwsaDataSOCKADDR_INsockaddr然后在需要开始受信的地方进行socket初始化,这里我用了一个按钮:intresult;WORDwVersionRequested;wVersionRequested=MAKEWORD(1,1);if(result=WSAStartup(wVersionRequested,&wsaData)!=0)Application-MessageBoxA(SocketInitialError,Error,MB_OK);WSACleanup();return;memset(&sockaddr,0,sizeof(sockaddr);/*设置端口号*/sockaddr.sin_port=htons(3000);sockaddr.sin_family=AF_INET;sockaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);sock=socket(AF_INET,SOCK_DGRAM,0);if(sock=INVALID_SOCKET)Application-MessageBoxA(SocketOpenfailed,Error,MB_OK);WSACleanup();return;result=bind(sock,(LPSOCKADDR)&sockaddr,sizeofsockaddr);if(result=SOCKET_ERROR)Application-MessageBoxA(BindError,Error,MB_OK);WSACleanup();return;/*自写函数getFileReady打开一个日志文件等待记录数据*/if(!getFileReady()WSACleanup();return;/*把StringGrid编辑区域清理一下*/sgLog-RowCount=2;sgLog-Rows1-Clear();sgLog-Cells01=1;lineCount=1;/*启动线程,接受数据*/recvFlag=true;tudpr=newTUDPR(true);tudpr-Resume();TUDPR是负责受信的线程,其类定义如下:classTUDPR:publicTThreadprivate:protected:void_fastcallExecute();public:_fastcallTUDPR(boolCreateSuspended);线程内的完整处理如下:#include#pragmahdrstop#include#includeTUDPR.h#includeMonitor.hexternintm_sendRcvFlag;externSOCKETsock;externWSADATAwsaData;externSOCKADDR_INsockaddr;#pragmapackage(smart_init)_fastcallTUDPR:TUDPR(boolCreateSuspended):TThread(CreateSuspended)void_fastcallTUDPR:Execute()intresult;unsignedcharrbufSNDRCVDATALEN;/*受信标志变量为真时接收数据*/while(recvFlag)result=recvfrom(sock,rbuf,SNDRCVDATALEN,0,NULL,NULL;if(!recvFlagbreak;if(result=SOCKET_ERROR)Application-MessageBoxA(ReceiveError,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省邹城市第一中学2025年化学高一第一学期期中检测试题含解析
- 弹性体改性沥青防水卷材热老化试验记录
- 【初三议论文作文】走进初三议论文范文600字三
- 论文的格式-怎样写论文(全文)
- 海南师范大学本科毕业论文(设计)
- 产品市场生命周期各阶段的特点及营销策略
- 毕业论文署名写作格式
- 浅析央视《今日说法》成功之原因
- 山东工商学院毕业论文统一格式的规定-工商-毕业论文
- 学术写作中的文字排版与格式要点
- 旅游景区管理制度大全
- 中考语文说明文阅读训练练习(含答案)
- 房地产开发质量管理职责与规范
- 电力设备维护服务企业的市场定位与营销策略
- 招标代理机构选取项目组织机构
- 初中英语语法课件-表示从属关系的连词
- 《数据采集技术》课件-使用 urllib 爬取网页
- 【MOOC】英文技术写作-东南大学 中国大学慕课MOOC答案
- 感冒课件主题教学课件
- 中华人民共和国学前教育法-知识培训
- 智慧医院ICU建设方案
评论
0/150
提交评论