C++-Builder下三种UDP通信实现方法的比较_第1页
C++-Builder下三种UDP通信实现方法的比较_第2页
C++-Builder下三种UDP通信实现方法的比较_第3页
C++-Builder下三种UDP通信实现方法的比较_第4页
C++-Builder下三种UDP通信实现方法的比较_第5页
已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论