版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、时90畤快20092009lfl9血计算机06-4班设计题目课程设计主要内容號构適门能架啲魂倾播*;ck涿阿誕対sosS编f亠-口nW一ffiwidOAP餅SL于nk力淳M血商SOW了了wi逋肘12345指导教师评语日月年002签一、设计要求1.WinSockAPI编程,实现局域网消息广播的实用程序;2通过查阅资料,简述单播、广播、多播的区别和联系,以及各自的优缺点和适应范围。二、开发环境与工具MicrosoftVisualStudio2008.WindowsXPSP3.三、设计原理Socket接口是网络编程(通常是TCP/IP协议,也可以是其他协议)的API。最早的Socket接口是Berk
2、eley接口,在Unix操作系统中实现。WinSock也是一个基于Socket模型的API,在MicrosoftWindows操作系统类中使用。它在Berkeley接口函数的基础之上,还增加了基于消息驱动机制的Windows扩展函数。Winscok1.1只支持TCP/IP网络,WinSock2.0增加了对更多协议的支持。单播:网络节点之间的通信就好像是人们之间的对话一样。如果一个人对另外一个人说话,那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行。多播:“多播”也可以称为“组播”,在网络技术的应用并不是很多,网上视频会议、网上视频点播特别适合采用多播方式。因为如
3、果采用单播方式,逐个节点传输,有多少个目标节点,就会有多少次传送过程,这种方式显然效率极低,是不可取的;如果采用不区分目标、全部发送的广播方式,虽然一次可以传送完数据,但是显然达不到区分特定数据接收对象的目的。采用多播方式,既可以实现一次传送所有目标节点的数据,也可以达到只对特定对象传送数据的目的。广播:“广播”在网络中的应用较多,如客户机通过DHCP自动获得IP地址的过程就是通过广播来实现的。但是同单播和多播相比,广播几乎占用了子网内网络的所有带宽。、系统功能描述及软件模块划分该软件能实现的功能:该软件主要实现了局域网聊天功能。通过定义一个消息结构体,把局域网通信中必要的信息包含进来便于操作
4、。发送的消息包含了自己的IP地址和名称,以及类型,程序中有一个线程专门接收并处理各种不同的消息。在同一个局域网中运行程序通过发送组播消息可以发现彼此,接收到对方的消息后就把对方加入好友列表中。之后就可以选择一个好友发送消息,或者群发消息。每个用户上线时都会广播自己上线的消息,其他用户收到后更新好友列表,把其IP和对应的用户名添加到好友列表中;下线时广播自己下线的消息,其他用户把其IP和用户名从好友列表中删除。软件的模块包括:套接字管理模块和主程序中的消息循环模块。五、设计步骤定义的一个消息类型和结构为:enumSendTypeLOAD,/上线REFRESH_SELF,刷新NOTIFY_ONE丄
5、EXIST,/回应消息表示自己存在CHANGE_NAME,修改名称SEND_MSG_TO_ONE,/向某个特定IP发送消息SEND_MSG_TO_ALL,/广播消息UNLOAD/下线;classMessageStructpublic:MessageStruct()type=LOAD;msg_name0=0;ip0=0;dialog0=0;SendTypetype;charmsg_name32;charip32;chardialog8192;套接字管理模块的核心代码如下:boolSocketManger:InitSocket(unsignedshortport)/初始化套接字m_socket=s
6、ocket(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(SOC
7、KADDR)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,I
8、PPROTO_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=newMes
9、sageStruct;intreval;charnameTemp32=0;charip32=0;charmsg8192=0;charbuff8300=0;CStringownIp;CStringreceivedIp=ip;while(true)reval=recvfrom(SocketManger:m_socket,(char*)pMessage,sizeof(MessageStruct),0,(SOCKADDR*)&addrFrom,&len);if(SOCKET_ERROR=reval)break;SendTypetype=pMessage-type;strncpy(nameTemp,pM
10、essage-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();f(ip=ownlp)/上线通知自己不做处理break;pDlg-PushNameToMap(ip,nameTemp);pDlg-UpdateTheList();:PostMessage(hwnd,WM_RECVDATA_NOTIFY_EXIST,0,(LPARAM)&addrFr
11、om);break;caseREFRESH_SELF:ownIp=pDlg-GetOwnIp();f(ip=ownlp)/上线通知自己不做处理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-UpdateTheLis
12、t();break;caseSEND_MSG_TO_ONE:sprintf(buff,%s对你说:rn%sn,nameTemp,msg);:PostMessage(hwnd,WM_RECVDATA_UPDATE_TEXT,0,(LPARAM)buff);break;caseSEND_MSG_TO_ALL:ownIp=pDlg-GetOwnIp();计(ip=ownlp)/上线通知自己不做处理break;sprintf(buff,%s对所有人说:rn%sn,nameTemp,msg);:PostMessage(hwnd,WM_RECVDATA_UPDATE_TEXT,0,(LPARAM)buff
13、);break;caseUNLOAD:pDlg-QuitNameFormMap(ip);pDlg-UpdateTheList();break;/quitmap-updatethelistdefault:break;deletelpParameter;return0;发送信模块:voidCChaChaChatDlg:OnBnClickedButtonSend()/sendto*intval=m_toAll.GetCheck();GetDlgItemText(IDC_EDIT_INPUT,m_msgInput);charmsgBuff8300=0;MessageStruct*pMsgStruct=
14、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_fami
15、ly=AF_INET;addrTo.sin_port=htons(9876);计(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);elseif(0=val&m_destIp!=)/单播pMs
16、gStruct-type=SEND_MSG_TO_ONE;addrTo.sin_addr.S_un.S_addr=inet_addr(m_destlp);/ip要加吗??sprintf(msgBuff,你对s说:rn%sn,m_destName,pMsgStruct-dialog);OnRecvDataUpdateText(0,(LPARAM)msgBuff);elsedeletepMsgStruct;AfxMessageBox(选择一个聊天对象!);return;sendto(SocketManger:m_socket,(char*)pMsgStruct,sizeof(MessageStru
17、ct),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_li
18、stUsers.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;elsefriendsMap.erase(where);fri
19、endsMap.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+上线了!;SetDlg
20、ItemText(IDC_NOTICE,notice.c_str();voidCChaChaChatDlg:QuitNameFormMap(std:stringstrIp)/从列表删除好友friendIterwhere;where=friendsMap.find(strIp);if(where=friendsMap.end()return;elsestd:stringnotice=上一动作:+where-second+下线了!;SetDlgItemText(IDC_NOTICE,notice.c_str();friendsMap.erase(where);六、设计结果登录界面如下:程序主界面如下:修改昵称界面:本程序把整个局域网当成一个聊天室,如果可以在同一个局域网中建立多个聊天室相信会更具有实用性。七、软件使用说明运行环境:Windo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 连续发酵技术原理与应用
- 培训班课件教学课件
- 培训主持人课件串词
- 园林绿化安全生产培训
- 口腔用药常识培训课件
- 华阳煤矿安全知识培训课件
- Unit 10 Is she a driver 第一课时(Part A、B、C)表格式公开课一等奖创新教学设计
- 分析室安全培训记录内容课件
- 道路工程材料课件 水泥混凝土组成设计实例
- 2025 小学一年级数学下册 20 以内退位减法算理课件
- 2026国企综合基础知识题库(附答案)
- 王昭君课件教学课件
- 债权人合同范本
- 易错点2.2摩擦力(解析版)高考易错点解读和针对训练
- 2025至2030丝苗米市场行业发展趋势分析与未来投资战略咨询研究报告
- 2026年教师资格之中学教育知识与能力考试题库300道含答案(a卷)
- 2025仁怀市公共交通服务有限公司招聘招聘141人考试笔试备考试题及答案解析
- 2026年电商评价管理策略与产品口碑优化实操手册
- 《短视频制作与运营》教案 项目5 短视频剪辑 (剪映)
- 小学STEM综合活动教学设计方案
- 2023年和田地区直遴选考试真题汇编附答案解析
评论
0/150
提交评论