版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机与信息学院《计算机网络系统实践》报告设计题目:广播通信设计学生姓名:学 号:专业班级:计算机06-4班,.2009年9月合肥工业大学课程设计任务书姓名 学号 班级 计算机06-4班,.设计广播通信设计成绩题目课1.掌握广播通信技术;程2.了解基于WinsockAPI的消息机制和编程应用方法;设计3.了解WindowsSDK编程架构。主4.WinSockAPI编程,实现局域网消息广播的实用程序;要内5.通过查阅资料,简述单播、广播、多播的区别和联系,以及各自的优缺点和容适应范围。指导教师评语签名:200年月日一、设计要求1.WinSockAPI编程,实现局域网消息广播的实用程序;感谢阅读,.2.通过查阅资料,简述单播、广播、多播的区别和联系,以及各自的优缺点精品文档放心下载和适应范围。二、开发环境与工具MicrosoftVisualStudio2008.感谢阅读WindowsXPSP3.三、设计原理Socket接口是网络编程(通常是 TCP/IP协议,也可以是其他协议)谢谢阅读API。最早的Socket接口是Berkeley接口,在Unix操作系统中实现。感谢阅读WinSock也是一个基于Socket模型的API,在MicrosoftWindows操作系统类中使用。它在Berkeley接口函数的基础之上,还增加了基于消息驱动机制的Windows扩展函数。Winscok1.1只支持TCP/IP网络,WinSock2.0增加了对更多协议的支持。谢谢阅读单播:网络节点之间的通信就好像是人们之间的对话一样。如果一个人对另外一个人说话,那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行。感谢阅读多播:“多播”也可以称为“组播”,在网络技术的应用并不是很多,网上视频会议、网上视频点播特别适合采用多播方式。因为如果采用单播方式,逐个节点传输,有多少个目标节点,就会有多少次传送过程,这种方式显然效率极低,是不可取的;如果采用不区分目标、全部发送的广播方式,虽然一次可以传送完数据,但是显然达不到区分特定数据接收对象的目的。采用多播方式,既可以实谢谢阅读,.现一次传送所有目标节点的数据,也可以达到只对特定对象传送数据的目的。谢谢阅读广播:“广播”在网络中的应用较多,如客户机通过DHCP自动获得IP地精品文档放心下载址的过程就是通过广播来实现的。但是同单播和多播相比,广播几乎占用了子网谢谢阅读内网络的所有带宽。四、系统功能描述及软件模块划分该软件能实现的功能:该软件主要实现了局域网聊天功能。通过定义一个消息结构体,把局域网通感谢阅读信中必要的信息包含进来便于操作。发送的消息包含了自己的IP地址和名称,精品文档放心下载以及类型,程序中有一个线程专门接收并处理各种不同的消息。在同一个局域网谢谢阅读中运行程序通过发送组播消息可以发现彼此,接收到对方的消息后就把对方加入感谢阅读好友列表中。之后就可以选择一个好友发送消息,或者群发消息。每个用户上线感谢阅读时都会广播自己上线的消息,其他用户收到后更新好友列表,把其IP和对应的感谢阅读用户名添加到好友列表中;下线时广播自己下线的消息,其他用户把其IP和用谢谢阅读户名从好友列表中删除。软件的模块包括:套接字管理模块和主程序中的消息循环模块。感谢阅读五、设计步骤定义的一个消息类型和结构为:enumSendType{LOAD,//上线REFRESH_SELF,//刷新NOTIFY_ONE_I_EXIST,//回应消息表示自己存在感谢阅读CHANGE_NAME,//修改名称SEND_MSG_TO_ONE,//向某个特定IP发送消息谢谢阅读SEND_MSG_TO_ALL,//广播消息UNLOAD//下线};,.classMessageStruct{public:MessageStruct(){type=LOAD;msg_name[0]='\0';ip[0]='\0';dialog[0]='\0';}SendTypetype;精品文档放心下载charmsg_name[32];charip[32];chardialog[8192];};套接字管理模块的核心代码如下:boolSocketManger::InitSocket(unsignedshortport)感谢阅读{//初始化套接字m_socket=socket(AF_INET,SOCK_DGRAM,0);谢谢阅读if(INVALID_SOCKET==m_socket)感谢阅读{AfxMessageBox("Createsocketfailed!",MB_OK);精品文档放心下载returnfalse;}SOCKADDR_INsocketSrv;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("Bindsocketfailed!");谢谢阅读closesocket(m_socket);returnfalse;}returntrue;}boolSocketManger::JoinGroupCast(conststd::string&multiIp)谢谢阅读{//加入组播组structip_mreqipmr;intlen=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);感谢阅读returntrue;}消息循环的主要代码如下:DWORDWINAPICChaChaChatDlg::RecvProc(LPVOIDlpParameter)谢谢阅读,.{CChaChaChatDlg*pDlg=((ParameterToThread*)lpParameter)->pDlg;谢谢阅读HWNDhwnd =((ParameterToThread*)lpParameter)->hwnd;谢谢阅读SOCKADDR_INaddrFrom;intlen= sizeof(SOCKADDR);感谢阅读MessageStruct*pMessage=newMessageStruct;精品文档放心下载intreval;charnameTemp[32]={0};charip[32]={'\0'};charmsg[8192]={'\0'};charbuff[8300]={'\0'};CStringownIp;CStringreceivedIp=ip;while(true){reval=recvfrom(SocketManger::m_socket,(char*)pMessage,sizeof(MessageStruct),0,(SOCKADDR*)&add精品文档放心下载rFrom,&len);if(SOCKET_ERROR==reval){break;}SendTypetype=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){caseLOAD:ownIp=pDlg->GetOwnIp();if(ip==ownIp)//上线通知自己不做处理谢谢阅读{break;}pDlg->PushNameToMap(ip,nameTemp);谢谢阅读pDlg->UpdateTheList();::PostMessage(hwnd,WM_RECVDATA_NOTIFY_EXIST,0,(LPARAM)&addrFrom);break;感谢阅读caseREFRESH_SELF:ownIp=pDlg->GetOwnIp();if(ip==ownIp)//上线通知自己不做处理感谢阅读{break;}::PostMessage(hwnd,WM_RECVDATA_ANSWER_REFRESH,0,(LPARAM)&addrFrom);break;感谢阅读,.caseCHANGE_NAME:pDlg->ChangeNameFromMap(ip,nameTemp);精品文档放心下载pDlg->UpdateTheList();break;caseNOTIFY_ONE_I_EXIST:pDlg->PushNameToMap(ip,nameTemp);谢谢阅读pDlg->UpdateTheList();break;caseSEND_MSG_TO_ONE:sprintf(buff,"[%s对你说:]\r\n%s\n",nameTemp,msg);::PostMessage(hwnd,WM_RECVDATA_UPDATE_TEXT,0,(LPARAM)buff);break;谢谢阅读caseSEND_MSG_TO_ALL:ownIp=pDlg->GetOwnIp();if(ip==ownIp)//上线通知自己不做处理谢谢阅读{break;}sprintf(buff,"[%s对所有人说:]\r\n%s\n",nameTemp,msg);::PostMessage(hwnd,WM_RECVDATA_UPDATE_TEXT,0,(LPARAM)buff);break;感谢阅读caseUNLOAD:pDlg->QuitNameFormMap(ip);谢谢阅读pDlg->UpdateTheList();break;//quitmap->updatethelist精品文档放心下载default:break;}}deletelpParameter;return0;}发送信息模块:voidCChaChaChatDlg::OnBnClickedButtonSend()//sendto****谢谢阅读{intval=m_toAll.GetCheck();精品文档放心下载GetDlgItemText(IDC_EDIT_INPUT,m_msgInput);感谢阅读charmsgBuff[8300]={'\0'};精品文档放心下载MessageStruct*pMsgStruct=newMessageStruct;谢谢阅读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_INaddrTo;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,"[你对大家说:]\r\n%s\n",pMsgStruct->dialog);OnRecvDataUpdateText(0,(LPARAM)msgBuff);精品文档放心下载}elseif(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说:]\r\n%s\n",m_destName,pMsgStruct->dialog);OnRecvDataUpdateText(0,(LPARAM)msgBuff);感谢阅读}else{deletepMsgStruct;AfxMessageBox("选择一个聊天对象!");精品文档放心下载return;}sendto(SocketManger::m_socket,(char*)pMsgStruct,sizeof(MessageStruct),0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));谢谢阅读deletepMsgStruct;SetDlgItemText(IDC_EDIT_INPUT,"");谢谢阅读}其他代码:voidCChaChaChatDlg::UpdateTheList()谢谢阅读{//更新好友列表m_listUsers.DeleteAllItems();谢谢阅读for(friendIteriter=friendsMap.begin();iter!=friendsMap.end();++iter)谢谢阅读{,.std::stringstrIp=(*iter).first;精品文档放心下载std::stringstrName=(*iter).second;谢谢阅读m_listUsers.InsertItem(0,strName.c_str());精品文档放心下载m_listUsers.SetItemText(0,1,strIp.c_str());精品文档放心下载}}voidCChaChaChatDlg::ChangeNameFromMap(std::stringstrIp,std::stringstrName)感谢阅读{//修改列表中名称friendIterwhere;where=friendsMap.find(strIp);谢谢阅读std::stringoldName=(*where).second;精品文档放心下载if(where==friendsMap.end())谢谢阅读return;else{friendsMap.erase(where);感谢阅读}friendsMap.insert(std::make_pair(strIp,strName));精品文档放心下载//提示:std::stringnotice="上一动作:["+oldName+"]将名字改为了["+strName+"]";SetDlgItemText(IDC_NOTICE,notice.c_str());感谢阅读}voidCChaChaChatDlg::PushNameToMap(std::stringstrIp,std::stringstrName)精品文档放心下载{//添加好友到列表friendsMap.insert(std::make_pair(strIp,strName));感谢阅读std::stringnotice="上一动作:["+strName+"]上线了!";精品文档放心下载SetDlgItemText(IDC_NOTICE,notice.c_str());感谢阅读}voidCChaChaChatDlg::QuitNameFormMap(std::stringstrIp)感谢阅读{//从列表删除好友friendIterwhere;where=friendsMap.find(strIp);感谢阅读if(where==friendsMap.end())感谢阅读return;else{std::stringnotice="上一动作:["+where->second+"]下线了!";SetDlgItemText(IDC_NOTICE,notice.c_str());friendsMap.erase(where);感谢阅读}}六、设计结果,.登录界面如下:程序主界面如下:修改昵称界面:,.本程序把整个局域网当成一个聊天室,如果
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文化场馆防水修缮合同
- 汽车制造厂外墙翻新腻子施工合同
- 郊区仓库租赁协议
- 桥梁施工平地机租赁合同
- 高速公路修建施工合同
- 电影院彩绘施工合同
- 证券交易所安保人员聘用协议
- 建筑施工合同:城市地下管网改造
- 城市公寓交易合同模板
- 纪念馆真石漆修复合同
- 2023年安全三类人员B类考试模拟试题及参考答案
- 八年级上册英语期末复习计划
- 会理2022年卫生系统招聘考试真题及答案解析二
- 设计中重点、难点及关键技术问题把握控制及相应措施把握难点
- YY/T 0698.2-2009最终灭菌医疗器械包装材料第2部分:灭菌包裹材料要求和试验方法
- GB/T 3274-2007碳素结构钢和低合金结构钢热轧厚钢板和钢带
- 《乡镇环境治理研究开题报告文献综述11000字》
- 山东省高等医学院校临床教学基地水平评估指标体系与标准(修订)
- 空白货品签收单
- 青海省全省市县乡镇卫生院街道社区卫生服务中心基本公共卫生服务医疗机构信息名单目录450家
- 网络暴力的法律规制开题报告
评论
0/150
提交评论