实验5广播通信设计_第1页
实验5广播通信设计_第2页
实验5广播通信设计_第3页
实验5广播通信设计_第4页
实验5广播通信设计_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机与信息学院《计算机网络系统实践》报告设计题目:广播通信设计学生姓名:学 号:专业班级:计算机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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论