当前位置:首页 >> 信息与通信 >>

基于UDP协议的组播通信程序设计


实验七

基于UDP 基于UDP协议的组播通信程序设计 UDP协议的组播通信程序设计

实验目的
1)了解以太网环境下,组播通信的基本原理。 了解以太网环境下,组播通信的基本原理。 掌握利用VC VC开发工具编写组播通信程序的方 2)掌握利用VC开发工具编写组播通信程序的方 法。 基于Winsock API编写 测试组播发送、 编

写、 3)基于Winsock API编写、测试组播发送、接 收程序。 收程序。

实验任务
1)完成GUI组播发送程序的编码 完成GUI组播发送程序的编码 GUI 完成GUI GUI组播接收程序的编码 2)完成GUI组播接收程序的编码 在共享局域网环境下完成发送、 3)在共享局域网环境下完成发送、接收程 序的测试
1

一、组播发送程序
编程步骤
创建对话框工程multicastsend; ① 创建对话框工程 ; 编辑对话框,添加编辑框控件类变量: ② 编辑对话框,添加编辑框控件类变量: m_SendMsg 添加包含文件和Winsock动态链接库 ③ 添加包含文件和 动态链接库 添加按钮函数OnOK() ④ 添加按钮函数OnOK() 编译、 ⑤ 编译、运行和测试

2

二、组播接收程序
编程步骤
创建对话框工程multicastRecv; ① 创建对话框工程 ; 编辑对话框,添加编辑框控件类变量: ② 编辑对话框,添加编辑框控件类变量: m_RecvMsg 添加包含文件和Winsock动态链接库 ③ 添加包含文件和 动态链接库 添加按钮函数OnOK() ④ 添加按钮函数OnOK() 编译、 ⑤ 编译、运行和测试

3

三、组播发送程序分析
void CMulticastsendDlg::OnOK() { //① 变量声明 ① int nRet,i; int nIP_TTL = 1; //IP数据报的 数据报的TTL值 数据报的 值 BOOL bFlag; DWORD cbRet; int iLen = MAXADDRSTR; //定义组播组地址 定义组播组地址 char strDestMulti[MAXADDRSTR] = "224.1.1.1"; //发送、接收端地址结构 发送、 发送 SOCKADDR_IN stSrcAddr,stDestAddr; SOCKET hSock; //消息发送、接收套接口 消息发送、 消息发送 u_short nDestPort = 6666; //接收端口 接收端口 char achOutBuf[BUFSIZE]; //发送缓冲区 发送缓冲区
4

三、组播发送程序分析
//②读取发送字符串,并复制到发送缓冲区 ②读取发送字符串, achOutBuf UpdateData(TRUE); strcpy(achOutBuf,m_SendMsg.GetBuffer(0)); nRet = CheckWinsockVersion();//③检查 ③检查Winsock版本 版本 if (nRet) { printf("WSAStartup failed:%d\r\n",nRet); exit(1);} //④将组播接收地址 转换为INET地址结构 ④将组播接收地址224.1.1.1转换为 转换为 地址结构 nRet = WSAStringToAddress(strDestMulti, AF_INET,NULL,(LPSOCKADDR)&stDestAddr,&iLen); if (nRet) {printf("WSAstringToAddress(%s)failed, Err:%d\n",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:%d\n",WSAGetLastError()); exit(1); }

6

三、组播发送程序分析
//⑥设置套接口选项,允许重用本地地址和端口 ⑥设置套接口选项, bFlag = TRUE; nRet = setsockopt(hSock,SOL_SOCKET, SO_REUSEADDR,(char *)&bFlag,sizeof(bFlag)); if (nRet == SOCKET_ERROR) printf("setsockopt()SO_REUSEADDR failed, Err:%d\n",WSAGetLastError()); //⑦填写发送端套接口地址结构 ⑦ stSrcAddr.sin_family = PF_INET; stSrcAddr.sin_port = htons(nDestPort); stSrcAddr.sin_addr.s_addr = INADDR_ANY; nRet = bind(hSock,(struct sockaddr FAR *) &stSrcAddr,sizeof(struct sockaddr)); if (nRet == SOCKET_ERROR) printf("bind failed, 7 Err:%d\n",WSAGetLastError());

三、组播发送程序分析
//⑧ 设置套接口工作方式,将IP数据报的 ⑧ 设置套接口工作方式, 数据报的TTL值设定为 值设定为1 数据报的 值设定为 nRet = WSAIoctl(hSock, SIO_MULTICAST_SCOPE, &nIP_TTL,sizeof(nIP_TTL), NULL,0,&cbRet,NULL,NULL); if (nRet) printf("WSAioctl(SIO_MULTICAST_SCOPE)failed, Err:%d\n",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:%d\n",WSAGetLastError());
8

三、组播发送程序分析
//填写接收端套接口地址结构 填写接收端套接口地址结构

stDestAddr.sin_family = PF_INET; nRet = WSAHtons(hSock,nDestPort, &(stDestAddr.sin_port)); if (nRet == SOCKET_ERROR) printf("WSAHtons()failed,Err:%d\n", WSAGetLastError());

9

三、组播发送程序分析
//⑨循环发送数据 ⑨

for (i=0;i<LOOPCOUNT;i++) { //组播发送 组播发送 nRet = sendto(hSock,achOutBuf,1024,0, (SOCKADDR *)&stDestAddr,sizeof(stDestAddr)); if (nRet == SOCKET_ERROR) printf("WSASendTo()failed, Err:%d\n",WSAGetLastError()); }
//关闭套接口,释放内存 关闭套接口, 关闭套接口

closesocket(hSock); WSACleanup(); }
10

三、组播发送程序分析
int CMulticastsendDlg::CheckWinsockVersion(VOID) { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2,2); err = WSAStartup(wVersionRequested,&wsaData); if (err == 0) {if ((LOBYTE(wsaData.wVersion) == 2) && (HIBYTE(wsaData.wVersion) == 2)) return 0; WSACleanup(); err = WSAVERNOTSUPPORTED;} printf("Winsock DLL does not support requested API version.\n"); return err;}
11

四、组播接收程序分析
void CMulticastRecvDlg::OnButton1() { UdpReceiver(); //hwp 增加初始化代码 } int CMulticastRecvDlg::UdpReceiver(VOID) { //① 变量声明 ① int nRet,i; int nIP_TTL = 1; BOOL bFlag; DWORD dFlag,cbRet; int iLen = MAXADDRSTR; char strDestMulti[MAXADDRSTR] = "224.1.1.1"; SOCKADDR_IN stSrcAddr,stDestAddr; SOCKET hSock,hNewSock; u_short nDestPort = 6666; char achInBuf[BUFSIZE];

12

四、组播接收程序分析
nRet = CheckWinsockVersion(); //②检查 ②检查Winsock版本 版本 if (nRet) { printf("WSAStartup failed:%d\r\n",nRet); exit(1); } //③将字符串组播地址“224.1.1.1” 转换为套接口地址 ③将字符串组播地址“ nRet = WSAStringToAddress(strDestMulti, AF_INET,NULL,(LPSOCKADDR)&stDestAddr,&iLen); if (nRet) { printf("WSAstringToAddress(%s)failed, Err:%d\n",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:%d\n",WSAGetLastError()); exit(1);}

//⑤设置套接口选项,允许重用本地地址和端口 ⑤设置套接口选项,
bFlag = TRUE; nRet = setsockopt(hSock,SOL_SOCKET, SO_REUSEADDR,(char *)&bFlag,sizeof(bFlag)); if (nRet == SOCKET_ERROR) printf("setsockopt()SO_REUSEADDR failed, Err:%d\n",WSAGetLastError());
14

四、组播接收程序分析
//⑥填写发送端套接口地址结构,并绑定到hSock上 ⑥填写发送端套接口地址结构,并绑定到 上 stSrcAddr.sin_family = PF_INET; stSrcAddr.sin_port = htons(nDestPort); stSrcAddr.sin_addr.s_addr = INADDR_ANY; nRet = bind(hSock,(struct sockaddr FAR *) &stSrcAddr,sizeof(struct sockaddr)); if (nRet == SOCKET_ERROR) printf("bind failed,Err:%d\n", WSAGetLastError());

15

四、组播接收程序分析
//⑦设置套接口工作方式,将IP数据报的 ⑦设置套接口工作方式, 数据报的TTL值设定为 值设定为1 数据报的 值设定为 nRet = WSAIoctl(hSock, SIO_MULTICAST_SCOPE,&nIP_TTL, sizeof(nIP_TTL),NULL,0,&cbRet,NULL,NULL); if (nRet) printf("WSAioctl(SIO_MULTICAST_SCOPE) failed,Err:%d\n",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:%d\n",WSAGetLastError()); 16

四、组播接收程序分析
//填写接收端套接口地址结构 填写接收端套接口地址结构 stDestAddr.sin_family = PF_INET; nRet = WSAHtons(hSock, nDestPort,&(stDestAddr.sin_port)); if (nRet == SOCKET_ERROR) printf("WSAHtons()failed,Err:%d\n", WSAGetLastError()); //⑧加入组播组 ⑧ hNewSock = WSAJoinLeaf(hSock, (PSOCKADDR)&stDestAddr,sizeof(stDestAddr), NULL,NULL,NULL,NULL,JL_BOTH); if (hNewSock == INVALID_SOCKET) printf("WSAJoinLeaf()failed, Err:%d\n",WSAGetLastError()); cbRet = 0;
17

四、组播接收程序分析
//⑨循环接收数据 ⑨ for (i=0;i<LOOPCOUNT;i++) { iLen = sizeof(stSrcAddr); dFlag = 0; int sendsize = sizeof(stSrcAddr); nRet = recvfrom(hSock,achInBuf, 1024,0,(SOCKADDR *)&stSrcAddr,&sendsize); cbRet = nRet; if (nRet == SOCKET_ERROR) printf("WSARecvFrom()failed, Err:%d\n",WSAGetLastError());

18

四、组播接收程序分析
//如果消息接收成功,调用函数WSAAddressToString将发送端 如果消息接收成功,调用函数 如果消息接收成功 将发送端 套接口地址转换为字符串 else { u_short nPort = 0; char achAddr[MAXADDRSTR+3] = {0}; iLen = MAXADDRSTR+3; unsigned long iLen1; iLen1 = iLen; nRet = WSAAddressToString((struct sockaddr *) &stSrcAddr,sizeof(stSrcAddr),NULL,achAddr,&iLen1); if (nRet == SOCKET_ERROR) printf("WSAAddressToString()failed, Err:%d\n",WSAGetLastError());
19

四、组播接收程序分析
//打印接收到的消息 打印接收到的消息 nRet = WSANtohs(hSock,stSrcAddr.sin_port,&nPort); if (nRet == SOCKET_ERROR) printf("WSANtohs()failed,Err: %d\n",WSAGetLastError()); m_RecvMsg.Format("WSARecvFrom()receiverd, %dbytes from%s,port%d:%s\r\n",cbRet, achAddr[0]?achAddr:"??",nPort,achInBuf); UpdateData(FALSE);}} //关闭套接口,释放内存 关闭套接口, 关闭套接口 closesocket(hNewSock); closesocket(hSock); WSACleanup(); return (0);}
20

五、程序测试
1、启动组播接收程序multicastRecv.exe 启动组播接收程序multicastRecv.exe

21

五、程序测试
2、启动组播发送程序BroadCast.exe 启动组播发送程序BroadCast.exe

输入待发送字符串: 输入待发送字符串:I send a Msg

22

五、程序测试
3、验证测试结果

23


相关文章:
基于UDP协议的聊天程序设计报告
这个软件是极具适 应性和实用性的即时通讯软件?本次课程设计的目的是学习基于 UDP 协议实现网络聊天程序?已达到学会面向无连接方式的程序设计方法 并理解网络编程中...
UDP组播程序编程
实验三一、实验目的 UDP 组播程序编程 掌握 UDP 协议的工作原理,掌握 SOCKET ...通信问题, 出现了一种多播技术 (也常称为组播通信) 它是基于 IP 层的通信...
UDP及TCP通信程序的设计与实现实验报告
UDP及TCP通信程序设计与实现实验报告_计算机软件及应用_IT/计算机_专业资料。...基于UDP协议的组播通信程... 23页 1下载券 喜欢此文档的还喜欢 TCP...
基于UDP网络通信系统的服务端程序设计
网络协议编程课程设计 赵思雨 时间 指导老师 2014 年 9 月 15 日—9 月 28 日 谢晓巍 基于 UDP 网络通信系统的服务端程序设计 (1)理解 UDP 协议的基本功能...
课程设计报告-基于udp协议的网络聊天程序设计
基于UDP的聊天程序设计与... 6页 1下载券 基于UDP通信的聊天程序 19页 2下载...9 //测试程序:不正确的情况——组播地址非法时。 //测试程序:不正确的情况—...
基于UDP组播技术网络会议程序设计实践
实验题目 基于 UDP 组播技术网络会议程序设计 实验时间 2013.5.14 1.实验题目...现在就登录>> 你可能喜欢©2013 Baidu 使用百度前必读 | 文库协议...
组播编程
基于UDP协议的组播通信程... 23页 1下载券 UDP组播程序编程 4页 1下载券 基于...2010-03-26 19:24560 人阅读评论(0)收藏举报 初识组播(1) 我们知道在内核...
基于UDP的程序设计
基于UDP的程序设计_计算机软件及应用_IT/计算机_专业资料。课程设计 III 课程...协议族为传输层设计的两个协议之一,它在进程与进程的通信过程中, 提供了有限...
基于TCP协议的网络通信设计与实现
基于TCP协议的网络通信设计与实现_计算机软件及应用_IT/计算机_专业资料。基于 ...协议)和 UDP(User Datagram Protocol,用户数据报 协议是传输层中最主要的协议)...
【UDP的组播发送接收程序】
UDP的组播发送接收程序】_计算机软件及应用_IT/计算机_专业资料。// 抬头: ...©2015 Baidu 使用百度前必读 | 文库协议 | 网站地图...
更多相关标签:
udp组播发送程序 | udp通信协议 | udp通信程序 | udp 组播 | udp组播测试工具 | udp组播地址 | c udp组播 | qt udp 组播 |