《现代电子技术》2006年第24期摘录:《现代电子技术}2006年第2
-
如发现有乱码,请点击下面链接浏览原文
正文摘录:
《现代电子技术}2006年第24期总第239期》嵌入式与单片机qread:TIdPeerThread);beginifnotAThread.TerminatedandAThread.Connection.ConnectedthenbeginGlobalReadSocketLengthFact:一AThread.Connection.Socket.Recv(GlobalReadSocketBuffer,SizeOf(GlobalReadSocketBuffer));FromlpAddressString:一AThread.Connection.Socket.Binding.PeerlP;ifGlobalReadSocketLengthFact~0thenPostMessage(GlobalAnyWindowsHandle,WM—ReadFinishSocket,0,O)end;3组播形式组播是Internet上较特殊的一类应用,国际组织标准化规定组播地址为从224.0.0.0到239.255.255.255,这类应用在Delphi下编程稍特殊,使用SocketAPI实现。通过多次实验,首先定义了自己的Socket相关结构,这里分2种形式:一种形式为Socketl.1;另一种形式为Sock—et2.2,实现代码差别较大。组播地址分为2类:一类为读;一类为写,使用StringList分别保存之。typeip—mreq=recordimr—multiaddr=in—addr;//IPmuhicastaddressofgroupimr—interface:in—addr;//localIPaddressofinterfaceend;varmreq:lp—mreq;Sock:TSOCKET;LocaIAddress:sockaddrin;SendRemoteAddress:sockaddrSocketl.1实现:LocalIPAddress:一GetIPAddress;SplitsIpAddressToInteger(LocalIPAddress,LocalAddressl,LoealAddress~:,LocalAddress3,LocalAddress4);//将IP号转换为数值status:一WSAStartup(MAKEWORD(1,1),wsdata);//定制UDP协议版本号sock:一socket(PFINET,SOCKDGRAM,IPPROTOuDP);//定制通信协议localaddress.sinfamily:一PFINET;localaddress.sinport:一htons(LocalPort);localaddress.sinaddr.Sunb。sbl:一Chr(LocalAddressl);localaddress.sinaddr.Sunb.sb2:一Chr(LocalAd—dress2):10caladdress.sinaddr.Sunb.sb3:-二Chr(LocalAd—dress3);localaddress.sinaddr.Sunb.sb4:一Chr(LocalAd—dress4);BindStatus:一bind(sock,10caladdress,sizeof(10calad—dress));//一一一一一一一一一一一一一一一一一一一一//F-llgrouPaddress,RcadRemoteWORKGROUPNUMBERTempReadlpAddress:一ReadRemoteGroupStringList.NtrlngsLlj;SplitsIpAddressToInteger(TempReadIpAddress,ReadRe—moteGroupAddressl,ReadRemoteGroupAddress2,eadRemoteGroupAddress3,ReadRemoteGroupAddress4);mreq.imrmultiaddr.SGroupAddressl);mreq.imrmuhiaddr.SGroupAddress2);mreq.imrmultiaddr.SGroupAddress3);mreq.imrmuhiaddr.SGroupAddress4);//RemoteReadgrouPaddress—un—b.s—bl:一Chr(ReadRemote—unb.sb2:unb.sb3:unb.sb4:Chr(ReadRemote一//0;chr(RcadRemote一//0;Chr(ReadRemote//0;mreq.imrinterface.Sunb.sbl:一Chr(LocalAddressl);//LOCALIPaddressmreq.imrinterface.Sunb.sb2:一Chr(LocalAddress2);mreq.imrinterface.Sunb.sb3:一Chr(LocalAddress3);mreq.imrinterface.Sunb.sb4:一Chr(LocalAddress4);ioctlsocket(sock,FIONBIO,paraforblock);SetSockoptStatusO:一0;SetSockoptStatusO:一setsockopt(sock,IPPROTOIP,IPADD—MEMBERSHIP,@mreq,//(char*)~mreq,sizeof(mreq));//加入到指定的多播组Socket2.2实现status:一WSA8tartup(MAKEWORD(2,2),wsdata);ifstatus=0thenbegin//g'J建一个套接字Sock:一WSASocket(AFINET,SOCKDGRAM,IPPROTOUDP,n订,O,(WSAFLAG0VERLAPPEDorWSAFLAGMULTIPOINTCLEAForWSAFLAGMULTIPOINTDLEAF)):bFlag:一true;//设置套接字选项,使套接字为可重用端口地址ifsetsockopt(Sock,SOLSOCKET,SOREUSEADDR,@bFlag,sizeof(bFlag))~>SOCKETERRORthenbeginlocal.sin—family:一AF—INET;//将套接字绑定到用户指定端口及默认的接口local.sinport:一htons(LocalPort);local.sinaddr.saddr:一htonl(INADDRANY);//localaddress.sinfamily:一PFINET;//localaddress.sinport:一htons(LoealPort);local.sinaddr.Sunb.sbl:一Byte(LocalAddressl);local.sinaddr.Sunb.sb2:一Byte(LocalAddress2);local.sinaddr.Sunb.sb3:一byte(LocalAddress3);10cal.sinaddr.Sunb。sb4:一byte(LocalAddress4);msTTL:一32;ifbind(Sock,@local,sizeof(10cal))<>SOCKETERRORthenbegin//设置多播返回(L00KBAcK),设置多播数据报传播范围(生存时间TTI.)IFSAIoctl(Sock,SIOMULTICASTSCOPE,@msTTI.,si—zeof(msTTL),nil,0,@cbRet,nil,nil)<>SOCKETERRORthenbeginifWSAIoctl(Sock,SIOMULTIPOINTLOOPBACK,(萄nLoopBack,sizeof(nLoopBack),nil,0,@cbRet,nil,nil)<>SOCKETERRORthenbeginfori:一0tojdobeginTempReadlpAddress:一ReadRemoteGroupStringList.StringsEli;msAddr:一Pchar(TempReadlpAddress):95
阅读此文(图):
点击此处在线翻阅