《现代电子技术》2006年第24期摘录:蔡文斋:用Indy组件设计通用
-
如发现有乱码,请点击下面链接浏览原文
正文摘录:
蔡文斋:用Indy组件设计通用网络调试器Remote.sinfamily:一AFINET;.Remote-.sinaddr.saddr:一m’etaddr(msAddr);Remot。e.sinport:一htons(RemotePort);//加入到指定的多播组,并指定为既作为发送者又作为接收者(JLBOTH)SockM:一WSAJoinI.eaf(Sock,@Remote,sizeof(Remotc:),nil,n.1,nil,nil,JLBOTH);WSAAsym:Sek:ct(Sock,SocketHandle,WMSOCKMS(j,FDREADorFDWRITEorFDCONNECTorFDCL()SEorFDACCEPT)<>SOCKETERRORthen//注册网络消息及其网络事件end;对Socketl.1下的UDP组播而言,使用接收线程和发送线程进行通信,而在Socket2.2下使用网络消息接收。3.1发送发送这段较复杂,首先用无线电按钮选择发送形式。字符型、字节型、文件型、弹道型。该段的本质就是填写发送缓冲区及发送长度,最后一句为设置发送事件有信号。真正的发送代码由各自的发送线程实现,也可以只编写为一个发送线程,根据发送类型选择用什么组件发送。D1字符型设计一编辑控件,将其copy到发送缓冲即可。D2字节型设计一String(Ⅲd控件。定制该控件键盘按下消息检查16进制输入正常否,再定制SetEditText方法。该方法检查每个子格子中是否超过2个字符输入,如果超过,不起作用,这样,可以保证一串16进制码为:1F2ADE34576DFF等样式。在界面上再设计位自动变换功能部分,该段主要实现以下功能:从格子中第几个格子开始,到第几个格子结束,每发送1次,该格子中的数据位自动加1,一直加到255再转下一格子,这样就仿真了这样一种情形:例如某协议下发送长度为32字节,从第3字节到第8字节表示各种状态变化。该仿真器可以快速自动设置,这样每100ms发一次,这样就可以测试出控制软件编程正确否。该段实现代码太长,省略之。D3文件型界面上定制装入文件相应按钮,再设置每次发送长度,用流文件装入文件,每发送一次文件指针下移一次,直至最后一帧发送完成。该部分实质为从文件读出缓冲区到发送缓冲区的填写,程序要控制发送次数,要求记住发送次数,如果中途停止,要求关闭文件,该段编程逻辑较清楚,异常处理要求较多。D4弹道型该功能仿真这样一种情形:根据某协议,欲发送字节信息,其中从第5字节起,每3个字节表示一个数,共3组数;用二进制补码表示一组弹道,已知弹道文件为A.txt,每秒给一次,要求每秒发20次,其他字节可定制。以往在控制程序编程时,要模仿这一动态过程,往往需要重新编制一发送程序,装入弹道后在插值处理后每秒20次后再发送,这款网络仿真机可自动仿真这一过程。实现方法为:设计一定制Form,该Form定制变元数目,变元占用字节数,从缓冲区哪个字节放置第一个变元,是补码表示还是原码表示;是否需要插值处理。当装入后,首先是一文本文体,读出这个文本文件中一行的变元数,用转换函数将其转化为字节型,占几个字节由定制Form决定。首先根据定制规格放人一缓冲区中,例:firstbuffeI’,将这些变换好的字节填写到发送缓冲相应字段,再将主界面格子中的其他字段填写到发送缓冲相应字段,这样就生成了一个统一的发送码段。每次发送时都记住发送位置,直到发送完成。至此,发送缓冲填写已编写完成,再编写各自的发送线程,发送线程永远在等发送事件,一旦等到,发送之。发送方式为:’I、cp/ip:IdTCPCIientl.WriteBuffer(G。lobalWriteSocketBuffer,GlobalSendSocketLength,false);UDP:UDPCIient-.SendBuffer((310balWriteSocket,。Buffer,(;lobalSend—SocketLengl.h):Socketl.1和Socket2.2Socket.StatusSend:一sendto(sock,GlobalWriteSocketBuffer,GlobalSendSocket.Length,O,//nil,Sen&·emoteaddress,dwSizeSend);3.2接收这几种方式的接收方式各不相当,对TCP/IP客户/服务器而言,服务器收方法为:GlobalReadSoeketLengl,hFact:一AThread.Conneet’ion.Socket.Recv((~tobalReadSoeketBuffer,Size()f((;lobalReadSocketBuffer));对UDP客户/服务器而言,服务器接收方法为:UDPServerUDPRead(Sender:T()bjeet;AData:TStrearn;ABinding:T’ldSocket:卜tandle);对Socketl.1下的uDP组播而言,使用线程接收。SocketStatus:一recvfl‘om(sock,(;lobalReadSocket。Buffc:r,1024.Ofnil},tempaddress,dwSize-):对S()cke:t2.2下的UDP组播而言,使用网络消息接收。Socke-tStatus:一recvfr(3m(SOC-k,GlobalReadSoc、ketBuffer,1024.O{nil),(下转第100页)
阅读此文(图):
点击此处在线翻阅