基于UDP协议的组播通信程序设计.ppt
《基于UDP协议的组播通信程序设计.ppt》由会员分享,可在线阅读,更多相关《基于UDP协议的组播通信程序设计.ppt(23页珍藏版)》请在冰豆网上搜索。
![基于UDP协议的组播通信程序设计.ppt](https://file1.bdocx.com/fileroot1/2022-10/30/bde4ec52-a511-4d99-ab3d-32c0d4c9e1d4/bde4ec52-a511-4d99-ab3d-32c0d4c9e1d41.gif)
实验七实验七实验七实验七基于基于基于基于UDPUDPUDPUDP协议的组播通信程序设计协议的组播通信程序设计协议的组播通信程序设计协议的组播通信程序设计q实验目的实验目的11)了解以太网环境下,组播通信的基本原理。
)了解以太网环境下,组播通信的基本原理。
22)掌握利用掌握利用VCVC开发工具编写组播通信程序的方开发工具编写组播通信程序的方法。
法。
33)基于)基于WinsockAPIWinsockAPI编写、测试组播发送、接编写、测试组播发送、接收程序。
收程序。
q实验任务实验任务11)完成完成GUIGUI组播发送程序的编码组播发送程序的编码22)完成完成GUIGUI组播接收程序的编码组播接收程序的编码33)在在共共享享局局域域网网环环境境下下完完成成发发送送、接接收收程程序的测试序的测试1一、组播发送程序一、组播发送程序编程步骤编程步骤创建对话框工程创建对话框工程multicastsend;编辑对话框,添加编辑框控件类变量:
编辑对话框,添加编辑框控件类变量:
m_SendMsg添加包含文件和添加包含文件和Winsock动态链接库动态链接库添加按钮函数添加按钮函数OnOK()编译、运行和测试编译、运行和测试2二、组播接收程序二、组播接收程序编程步骤编程步骤创建对话框工程创建对话框工程multicastRecv;编辑对话框,添加编辑框控件类变量:
编辑对话框,添加编辑框控件类变量:
m_RecvMsg添加包含文件和添加包含文件和Winsock动态链接库动态链接库添加按钮函数添加按钮函数OnOK()编译、运行和测试编译、运行和测试3三、组播发送程序分析三、组播发送程序分析voidCMulticastsendDlg:
OnOK()/变量声明变量声明intnRet,i;intnIP_TTL=1;/IP数据报的数据报的TTL值值BOOLbFlag;DWORDcbRet;intiLen=MAXADDRSTR;/定义组播组地址定义组播组地址charstrDestMultiMAXADDRSTR=224.1.1.1;/发送、接收端地址结构发送、接收端地址结构SOCKADDR_INstSrcAddr,stDestAddr;SOCKEThSock;/消息发送、接收套接口消息发送、接收套接口u_shortnDestPort=6666;/接收端口接收端口charachOutBufBUFSIZE;/发送缓冲区发送缓冲区4三、组播发送程序分析三、组播发送程序分析/读取发送字符串,并复制到发送缓冲区读取发送字符串,并复制到发送缓冲区achOutBufUpdateData(TRUE);strcpy(achOutBuf,m_SendMsg.GetBuffer(0);nRet=CheckWinsockVersion();/检查检查Winsock版本版本if(nRet)printf(WSAStartupfailed:
%drn,nRet);exit
(1);/将组播接收地址将组播接收地址224.1.1.1转换为转换为INET地址结构地址结构nRet=WSAStringToAddress(strDestMulti,AF_INET,NULL,(LPSOCKADDR)&stDestAddr,&iLen);if(nRet)printf(WSAstringToAddress(%s)failed,Err:
%dn,strDestMulti,WSAGetLastError();exit
(1);5三、组播发送程序分析三、组播发送程序分析/初始化一个组播发送套接口初始化一个组播发送套接口hSock=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,(LPWSAPROTOCOL_INFO)NULL,0,WSA_FLAG_OVERLAPPED|WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);if(hSock=INVALID_SOCKET)printf(WSASocket()failed,Err:
%dn,WSAGetLastError();exit
(1);6三、组播发送程序分析三、组播发送程序分析/设置套接口选项,允许重用本地地址和端口设置套接口选项,允许重用本地地址和端口bFlag=TRUE;nRet=setsockopt(hSock,SOL_SOCKET,SO_REUSEADDR,(char*)&bFlag,sizeof(bFlag);if(nRet=SOCKET_ERROR)printf(setsockopt()SO_REUSEADDRfailed,Err:
%dn,WSAGetLastError();/填写发送端套接口地址结构填写发送端套接口地址结构stSrcAddr.sin_family=PF_INET;stSrcAddr.sin_port=htons(nDestPort);stSrcAddr.sin_addr.s_addr=INADDR_ANY;nRet=bind(hSock,(structsockaddrFAR*)&stSrcAddr,sizeof(structsockaddr);if(nRet=SOCKET_ERROR)printf(bindfailed,Err:
%dn,WSAGetLastError();7三、组播发送程序分析三、组播发送程序分析/设置套接口工作方式,将设置套接口工作方式,将IP数据报的数据报的TTL值设定为值设定为1nRet=WSAIoctl(hSock,SIO_MULTICAST_SCOPE,&nIP_TTL,sizeof(nIP_TTL),NULL,0,&cbRet,NULL,NULL);if(nRet)printf(WSAioctl(SIO_MULTICAST_SCOPE)failed,Err:
%dn,WSAGetLastError();/设置套接口工作方式,允许内部回送设置套接口工作方式,允许内部回送bFlag=TRUE;nRet=WSAIoctl(hSock,SIO_MULTIPOINT_LOOPBACK,&bFlag,sizeof(bFlag),NULL,0,&cbRet,NULL,NULL);if(nRet)printf(WSAioctl(SIO_MULTIPOINT_LOOPBACK)failed,Err:
%dn,WSAGetLastError();8三、组播发送程序分析三、组播发送程序分析/填写接收端套接口地址结构填写接收端套接口地址结构stDestAddr.sin_family=PF_INET;nRet=WSAHtons(hSock,nDestPort,&(stDestAddr.sin_port);if(nRet=SOCKET_ERROR)printf(WSAHtons()failed,Err:
%dn,WSAGetLastError();9三、组播发送程序分析三、组播发送程序分析/循环发送数据循环发送数据for(i=0;iLOOPCOUNT;i+)/组播发送组播发送nRet=sendto(hSock,achOutBuf,1024,0,(SOCKADDR*)&stDestAddr,sizeof(stDestAddr);if(nRet=SOCKET_ERROR)printf(WSASendTo()failed,Err:
%dn,WSAGetLastError();/关闭套接口,释放内存关闭套接口,释放内存closesocket(hSock);WSACleanup();10三、组播发送程序分析三、组播发送程序分析intCMulticastsendDlg:
CheckWinsockVersion(VOID)WORDwVersionRequested;WSADATAwsaData;interr;wVersionRequested=MAKEWORD(2,2);err=WSAStartup(wVersionRequested,&wsaData);if(err=0)if(LOBYTE(wsaData.wVersion)=2)&(HIBYTE(wsaData.wVersion)=2)return0;WSACleanup();err=WSAVERNOTSUPPORTED;printf(WinsockDLLdoesnotsupportrequestedAPIversion.n);returnerr;11四、组播接收程序分析四、组播接收程序分析voidCMulticastRecvDlg:
OnButton1()UdpReceiver();/hwp增加初始化代码增加初始化代码intCMulticastRecvDlg:
UdpReceiver(VOID)/变量声明变量声明intnRet,i;intnIP_TTL=1;BOOLbFlag;DWORDdFlag,cbRet;intiLen=MAXADDRSTR;charstrDestMultiMAXADDRSTR=224.1.1.1;SOCKADDR_INstSrcAddr,stDestAddr;SOCKEThSock,hNewSock;u_shortnDestPort=6666;charachInBufBUFSIZE;12四、组播接收程序分析四、组播接收程序分析nRet=CheckWinsockVersion();/检查检查Winsock版本版本if(nRet)printf(WSAStartupfailed:
%drn,nRet);exit
(1);/将字符串组播地址将字符串组播地址“224.1.1.1”转换为套接口地址转换为套接口地址nRet=WSAStringToAddress(strDestMulti,AF_INET,NULL,(LPSOCKADDR)&stDestAddr,&iLen);if(nRet)printf(WSAstringToAddress(%s)failed,Err:
%dn,strDestMulti,WSAGetLastError();exit
(1);13四、组播接收程序分析四、组播接收程序分析/初始化初始化UDP套接口套接口hSock=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,(LPWSAPROTOCOL_INFO)NULL,0,WSA_FLAG_OVERLAPPED|WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);if(hSock=INVALID_SOCKET)printf(WSASocket()failed,Err:
%dn,WSAGetLastError();exit
(1);/设置套接口选项,允许重用本地地址和端口设置套接口选项,允许重用本地地址和端口bFlag=TRUE;nRet=setsockopt(hSock,SOL_SOCKET,SO_REUSEADDR,(char*)&bFlag,sizeof(bFlag);if(nRet=SOCKET_ERROR)printf(setsockopt()SO_REUSEADDRfailed,Err:
%dn,WSAGetLastError();14四、组播接收程序分析四、组播接收程序分析/填写发送端套接口地址结构,并绑定到填写发送端套接口地址结构,并绑定到hSock上上stSrcAddr.sin_family=PF_INET;stSrcAddr.sin_port=htons(nDestPort);stSrcAddr.sin_addr.s_addr=INADDR_ANY;nRet=bind(hSock,(structsockaddrFAR*)&stSrcAddr,sizeof(structsockaddr);if(nRet=SOCKET_ERROR)printf(bindfailed,Err:
%dn,WSAGetLastError();15四、组播接收程序分析四、组播接收程序分析/设置套接口工作方式,将设置套接口工作方式,将IP数据