实验5广播通信设计

上传人:豆*** 文档编号:128678784 上传时间:2022-08-01 格式:DOC 页数:12 大小:166KB
返回 下载 相关 举报
实验5广播通信设计_第1页
第1页 / 共12页
实验5广播通信设计_第2页
第2页 / 共12页
实验5广播通信设计_第3页
第3页 / 共12页
点击查看更多>>
资源描述
计算机与信息学院计算机网络系统实践报告设计题目:广播通信设计学生姓名:学 号:专业班级:计算机06-4班 年 9 月合肥工业大学课程设计任务书姓名学号班级计算机06-4班设 计题 目广播通信设计成绩课程设计主要内容1掌握广播通信技术;2理解基于Winsock API的消息机制和编程应用措施;3理解Windows SDK编程架构。4WinSock API编程,实现局域网消息广播的实用程序;5通过查阅资料,简述单播、广播、多播的区别和联系,以及各自的优缺陷和适应范畴。 指导教师评语签名: 200 年 月 日一、 设计规定 1WinSock API编程,实现局域网消息广播的实用程序; 2通过查阅资料,简述单播、广播、多播的区别和联系,以及各自的优缺陷和适应范畴。二、 开发环境与工具 Microsoft Visual Studio .Windows XP SP3.三、 设计原理Socket接口是网络编程(一般是TCP/IP合同,也可以是其她合同)的API。最早的Socket接口是Berkeley接口,在Unix操作系统中实现。WinSock也是一种基于Socket模型的API,在Microsoft Windows操作系统类中使用。它在Berkeley接口函数的基本之上,还增长了基于消息驱动机制的Windows扩展函数。Winscok1.1只支持TCP/IP网络,WinSock2.0增长了对更多合同的支持。单播:网络节点之间的通信就仿佛是人们之间的对话同样。如果一种人对此外一种人说话,那么用网络技术的术语来描述就是“单播”,此时信息的接受和传递只在两个节点之间进行。多播:“多播”也可以称为“组播”,在网络技术的应用并不是诸多,网上视频会议、网上视频点播特别适合采用多播方式。由于如果采用单播方式,逐个节点传播,有多少个目的节点,就会有多少次传送过程,这种方式显然效率极低,是不可取的;如果采用不辨别目的、所有发送的广播方式,虽然一次可以传送完数据,但是显然达不到辨别特定数据接受对象的目的。采用多播方式,既可以实现一次传送所有目的节点的数据,也可以达到只对特定对象传送数据的目的。广播:“广播”在网络中的应用较多,如客户机通过DHCP自动获得IP地址的过程就是通过广播来实现的。但是同单播和多播相比,广播几乎占用了子网内网络的所有带宽。四、 系统功能描述及软件模块划分该软件能实现的功能:该软件重要实现了局域网聊天功能。通过定义一种消息构造体,把局域网通信中必要的信息涉及进来便于操作。发送的消息涉及了自己的IP地址和名称,以及类型,程序中有一种线程专门接受并解决多种不同的消息。在同一种局域网中运营程序通过发送组播消息可以发现彼此,接受到对方的消息后就把对方加入好友列表中。之后就可以选择一种好友发送消息,或者群发消息。每个顾客上线时都会广播自己上线的消息,其她顾客收到后更新好友列表,把其IP和相应的顾客名添加到好友列表中;下线时广播自己下线的消息,其她顾客把其IP和顾客名从好友列表中删除。软件的模块涉及:套接字管理模块和主程序中的消息循环模块。五、设计环节定义的一种消息类型和构造为:enum SendType LOAD,/上线REFRESH_SELF,/刷新NOTIFY_ONE_I_EXIST,/回应消息表达自己存在CHANGE_NAME,/修改名称SEND_MSG_TO_ONE, /向某个特定IP发送消息SEND_MSG_TO_ALL, /广播消息UNLOAD/下线;class MessageStructpublic:MessageStruct()type = LOAD; msg_name0 = 0; ip0 = 0; dialog0 = 0;SendType type;char msg_name32;char ip32;char dialog8192;套接字管理模块的核心代码如下:bool SocketManger:InitSocket(unsigned short port)/初始化套接字m_socket = socket(AF_INET ,SOCK_DGRAM ,0);if (INVALID_SOCKET = m_socket)AfxMessageBox(Create socket failed!,MB_OK);return false;SOCKADDR_IN socketSrv;socketSrv.sin_family = AF_INET;socketSrv.sin_port = htons(port);socketSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);if (SOCKET_ERROR = bind(m_socket, (SOCKADDR*)&socketSrv, sizeof(SOCKADDR)AfxMessageBox(Bind socket failed!);closesocket(m_socket);return false;return true;bool SocketManger:JoinGroupCast(const std:string& multiIp)/加入组播组struct ip_mreq ipmr;int len = sizeof(ipmr);ipmr.imr_multiaddr.s_addr = inet_addr(multiIp.c_str();ipmr.imr_interface.s_addr = htonl(INADDR_ANY);setsockopt(m_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&ipmr, len);return true;消息循环的重要代码如下:DWORD WINAPI CChaChaChatDlg:RecvProc(LPVOID lpParameter)CChaChaChatDlg *pDlg = (ParameterToThread*)lpParameter)-pDlg;HWND hwnd = (ParameterToThread*)lpParameter)-hwnd;SOCKADDR_IN addrFrom;int len = sizeof(SOCKADDR);MessageStruct *pMessage = new MessageStruct;int reval;char nameTemp32 = 0;char ip32 = 0;char msg8192 = 0;char buff8300 = 0;CString ownIp;CString receivedIp = ip;while(true)reval = recvfrom(SocketManger:m_socket,(char*)pMessage,sizeof(MessageStruct),0,(SOCKADDR*)&addrFrom,&len);if(SOCKET_ERROR = reval)break;SendType type = pMessage-type;strncpy(nameTemp,pMessage-msg_name,sizeof(nameTemp)-1);strncpy(ip,pMessage-ip,sizeof(ip)-1);strncpy(msg,pMessage-dialog,sizeof(msg)-1);switch(type)case LOAD:ownIp = pDlg-GetOwnIp();if (ip = ownIp)/上线告知自己不做解决break;pDlg-PushNameToMap(ip,nameTemp);pDlg-UpdateTheList();:PostMessage(hwnd,WM_RECVDATA_NOTIFY_EXIST,0,(LPARAM)&addrFrom);break;case REFRESH_SELF:ownIp = pDlg-GetOwnIp();if (ip = ownIp)/上线告知自己不做解决break;:PostMessage(hwnd,WM_RECVDATA_ANSWER_REFRESH,0,(LPARAM)&addrFrom);break;case CHANGE_NAME:pDlg-ChangeNameFromMap(ip,nameTemp);pDlg-UpdateTheList();break;case NOTIFY_ONE_I_EXIST:pDlg-PushNameToMap(ip,nameTemp);pDlg-UpdateTheList();break;case SEND_MSG_TO_ONE:sprintf(buff,%s 对你说:rn%sn,nameTemp, msg);:PostMessage(hwnd,WM_RECVDATA_UPDATE_TEXT,0,(LPARAM)buff);break;case SEND_MSG_TO_ALL:ownIp = pDlg-GetOwnIp();if (ip = ownIp)/上线告知自己不做解决break;sprintf(buff,%s 对所有人说:rn%sn,nameTemp, msg);:PostMessage(hwnd,WM_RECVDATA_UPDATE_TEXT,0,(LPARAM)buff);break;case UNLOAD:pDlg-QuitNameFormMap(ip);pDlg-UpdateTheList();break;/quit map - update the listdefault: break; delete lpParameter;return 0;发送信息模块:void CChaChaChatDlg:OnBnClickedButtonSend()/send to *int val = m_toAll.GetCheck();GetDlgItemText(IDC_EDIT_INPUT,m_msgInput);char msgBuff8300 = 0;MessageStruct * pMsgStruct = new MessageStruct;strcpy(pMsgStruct-msg_name,m_userName.GetBuffer(m_userName.GetLength();if (m_msgInput = )AfxMessageBox(不要发送空信息!);return;if (m_msgInput.GetLength() 8000)AfxMessageBox(字数太多了,不要超过字!);return;strcpy(pMsgStruct-dialog,m_msgInput.GetBuffer(m_msgInput.GetLength();SOCKADDR_IN addrTo;addrTo.sin_family = AF_INET;addrTo.sin_port = htons(9876);if (1 = val)/组播pMsgStruct-type = SEND_MSG_TO_ALL;strcpy(pMsgStruct-ip,m_ip.GetBuffer(m_ip.GetLength();addrTo.sin_addr.S_un.S_addr = inet_addr(234.5.6.7);sprintf(msgBuff,你对人们说:rn%sn,pMsgStruct-dialog);OnRecvDataUpdateText(0,(LPARAM)msgBuff);else if (0 = val & m_destIp != )/单播pMsgStruct-type = SEND_MSG_TO_ONE;addrTo.sin_addr.S_un.S_addr = inet_addr(m_destIp);/ip要加 吗?sprintf(msgBuff,你对%s 说:rn%sn, m_destName, pMsgStruct-dialog);OnRecvDataUpdateText(0,(LPARAM)msgBuff);else delete pMsgStruct; AfxMessageBox(选择一种聊天对象!);return;sendto(SocketManger:m_socket,(char*)pMsgStruct, sizeof(MessageStruct), 0, (SOCKADDR*)&addrTo, sizeof(SOCKADDR);delete pMsgStruct;SetDlgItemText(IDC_EDIT_INPUT,);其她代码:void CChaChaChatDlg:UpdateTheList()/更新好友列表m_listUsers.DeleteAllItems();for (friendIter iter = friendsMap.begin(); iter !=friendsMap.end(); +iter)std:string strIp = (*iter).first;std:string strName = (*iter).second;m_listUsers.InsertItem(0,strName.c_str();m_listUsers.SetItemText(0,1,strIp.c_str();void CChaChaChatDlg:ChangeNameFromMap(std:string strIp, std:string strName)/修改列表中名称friendIter where;where = friendsMap.find(strIp);std:string oldName = (*where).second;if ( where = friendsMap.end()return;else friendsMap.erase( where );friendsMap.insert(std:make_pair(strIp,strName);/提示:std:string notice = 上一动作: + oldName + 将名字改为了 + strName + ;SetDlgItemText(IDC_NOTICE,notice.c_str();void CChaChaChatDlg:PushNameToMap(std:string strIp, std:string strName)/添加好友到列表friendsMap.insert(std:make_pair(strIp,strName);std:string notice = 上一动作: + strName + 上线了!;SetDlgItemText(IDC_NOTICE,notice.c_str();void CChaChaChatDlg:QuitNameFormMap(std:string strIp)/从列表删除好友friendIter where;where = friendsMap.find(strIp);if ( where = friendsMap.end()return;else std:string notice = 上一动作: + where-second + 下线了!;SetDlgItemText(IDC_NOTICE,notice.c_str();friendsMap.erase( where );六、设计成果登录界面如下:程序主界面如下:修改昵称界面:本程序把整个局域网当成一种聊天室,如果可以在同一种局域网中建立多种聊天室相信会更具有实用性。七、软件使用阐明运营环境:Windows获更高版本硬件规定:CPU:双核主频2.0G,单核主频3.0G内存:1G硬盘:300G程序运营后先要输入顾客名,该顾客名可以在主界面中的设立菜单下更改昵称。然后就可以在主界面右边的好友列表中显示局域网中所有在线顾客,此时就可以选中某个顾客进行一对一聊天,或者选中左下角的ToAll复选框进行消息群发操作。点击刷新按钮可以刷新好友列表。聊天结束关闭主界面即推出程序。八、参照资料【1】网络程序设计郭学理 张健著 武汉大学出版社【2】数据通信与计算机网络 高等教育出版社【3】MSDN九、验收时间及验收状况(注意,不容许提及自己的验收成绩)验收时间:9月10日验收状况:通过十、设计体会在当今电脑网络密布的世界当中,一种简朴高效的局域网通信工具具有很高的实用性。在这次的课程设计中,我应用了VS开发工具在WINDOWS平台上开发了一种基于WINDOWS平台的局域网通信工具,在这一领域进行了有关的实践,不管是实际动手能力,还是资料查阅能力,都起了相称大的益处。从这次设计中,我充足结识到了VC+的高效的开发能力,以及WINDOWS平台一如既往的易用性。它的那些完善的编程接口,的确大大以便了开发人员的工作,固然也使得它这个系统自身的推广更加的简朴。此外,我也在这次设计中看到了自己的许多局限性之处,例如当系统编写遇到困境的时候,我想过要删减系统的功能或者放弃良好的代码构造,以便系统的得以完毕。我的知识构造也不是足够的充足,特别是软件工程部分的知识,由于没有做真正的工业化的系统设计,因此诸多环节都是自己临时学习,大大影响了系统的开发进度。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!