




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机网络课程设计报告姓名:学号:班级:指导老师:湖南科技大学计算机科学与工程学院2021年6月目录课程设计目的1课程设计内容1课程设计题目2网络聊天程序设计2Ping程序设计5基于IP多播的网络会议程序6心得体会8参考文献8附录(源代码)8一、课程设计目的加深对计算机网络通信的工作原理的理解。通过编写计算机程序实现、模拟网络的某些功能,使学生理解并掌握计算机网络的基本原理及工作过程。实现应用程序进程跨网络的通信了解系统调用和应用编程接口基本知识,理解应用程序和操作系统之间传递控制权的机制,掌握套接字的创建和运用,通过socket系统调用实现跨网络通信。提高网络编程和应用能力提高实际编程能力和灵活运用所学知识解决的能力。培养调查研究、查阅技术文献、资料、手册以及编写技术文档的能力,理论应用于实践的能力。课程设计内容网络聊天程序的设计与实现了解socket通信的原理,在此基础上编写一个一个聊天程序。Ping程序设计与实现了解ping程序的实现原理,并调试通过。基于IP多播的网络会议程序由sender和receiver两个程序组成,sender用户从控制台输入多播发送数据,receiver端都要求加入同一个多播组,完成sender发送的多播数据。课程设计题目1.聊天程序设计与实现2.Ping程序设计与实现3.基于IP多播的网络会议程序设计四、网络聊天程序设计4.1设计步骤服务器端编程的步骤:加载套接字库,创建套接字(WSAStartup()/socket());绑定套接字到一个IP地址和一个端口上;将套接字设定为监听模式等待连接请求(listen());请求到来后,接受链接请求,返回一个新的应对于此次链接 的套接字(accept());返回套接字和客户端进行通信(send()/recv());返回,等待另一个连接请求;关闭套接字,关闭套接字库(closesocket()WSACleanup())。客户端编程步骤:加载套接字库,创建套接字(WSAStartup()/socket());向服务端发出链接请求(connect());和服务端进行通信(send()/recv());关闭套接字,关闭套接字库(closesocket()/WSACleanup())4.2调试过程该程序是用c++编写的,用MFC做的界面,首先,我先用c++编写一个客户端和一个服务器端,代码主要是参照了实验说明书上的,在此基础上稍做了些修改,实现一个简单客户端与服务端通信。在实现过程中出现了问题,后来通过网上查资料和请教别人解决了。例如:与没有链接ws2_32.lib的库文件,是程序编译时出现错误;还有由于我用的是TCP协议通讯,它一次只接收一个数据包,这样就只能实现点对点通信,而不能异步通信,后来,我通过一个简单的线程解决了该问题;另外,在使用MFC封装的时候,由于服务端要使用监听模式,当没有收到连接请求时,会出现阻塞现象,也是用进程解决的。4.3设计结果和结果分析该程序的最终结果是一个可以在局域网内进行简单异步通信的程序,如下图所示:分析:该聊天程序的最终结果如上图所示,由一个界面构成,一个端口作为客户端,一个端口作为服务端,连接成功后,就可以在输入框里进行聊天,然后显示在一个显示框里。主要的缺点是,只能实现一对一的聊天,不能够实现一对多的。另附源代码于附录一Ping程序设计与实现5.1设计步骤熟悉IP及ICMP协议的工作机制。熟悉RAW模式的SOCKET编程。编写Ping的实现程序。编译环境中需要包括的SOCKET库win2_32.lib。调试并运行自己编写的Ping程序。5.2调试过程该程序是用c++在VC6.0下实现的,在编写过程中,出现了各种问题,因为该程序相对来说比较复杂,要实现查询指定IP的是否在线、还有它的路由号和传送的数据大小。由于对IP和ICMP协议的使用还不是很熟练,在实现过程中,虽然了解其主要的原理,但是总会出现一些细节方面的错误,使程序无法编译通过,再经过仔细检查之,终于成功实现了。5.3设计结果及结果分析在编译通过后,就可以调用该程序保存目录下的可执行文件了,通过命令提示符来操作,具体结果如下图所示:分析:如上图所示,该程序是我自己编写的一个实现Ping的功能的程序,它的功能主要有三个,通过令:ping39可以查询该IP是否在线,还有-r,-d两个命令是查找目的地址的如有何发送数据报的大小的。源代码另附于附录二基于IP多播的网络会议程序6.1设计步骤启动Visualc++6.0,创建一个控制台项目工程,在此工程下添加Sender和Receiver两个项目。Receiver项目实现步骤:、创建一个SOCK_DGRAM类型的Socket。、将此socket绑定到本地的一个端口上,为了实现接 收服务器端发送的多播数据。加入多播组。接受多播数据。Sender实现步骤:、创建一个SOCK_DGRAM类型的Socket。、加入多播组。、发送多播数据。然后运行各自的程序,进行调试。6.2调试过程该程序至少需要在两台机器上进行测试,因为要有一个发送方和一个接收方,发送方执行Sender项目,接受方执行Reciever项目,然后看是否能正常发送和接受。6.3调试结果及结果分析。该程序的最终目的是实现多播,就是能同时给多带计算机发送消息,运行结果如下图所示:以上两个图就是该程序运行时的结果,一方法送,另一方接收, 并显示其IP地址,但还有一些不足只处,没能将它整合成一个即 能接收又能发送消息的,并有界面的设计。源代码另附于附录三。心得体会通过本次课程设计,我收获了不少东西,通过编写计算机程序实现、模拟网络的一些功能,使我理解并掌握计算机网络的基本原理及工作过程。对系统调用和应用编程接口基本知识更加熟悉,了解了应用程序和操作系统之间传递控制权的机制,并掌握了套接字的创建和运用,通过socket系统调用实现跨网络通信。同时提高了我实际编程能力和灵活运用所学知识解决的能力。 让我提高了自己调查研究、查阅技术文献、资料、手册以及编写 技术文档的能力,理论应用于实践的能力。八、参考文献[1].谢希仁,计算机网络(第五版),电子工业出版社,2021。[2].百度[3]计算网络课程设计指导书。附录附录一:聊天程序源代码附录二:Ping程序源代码附录三:IP多播的网络会议程序源代码附录一:创建服务器函数:voidCChatDlg::OnCreateServer(){ //TODO:Addyourcontrolnotificationhandlercodehere CWnd*subWnd; CStringport; subWnd=GetDlgItem(IDC_EDIT5); subWnd->GetWindowText(port); UINTintport=UINT(atoi(LPCSTR(port))); WORDwVersionRequested; WSADATAwsaData; interr; wVersionRequested=MAKEWORD(1,1); err=WSAStartup(wVersionRequested,&wsaData); if(err!=0) { return; } if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1) { WSACleanup(); return; } SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0); addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(intport); intret=bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); listen(sockSrv,5); intlen=sizeof(SOCKADDR); sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); charsendBuf[50]; sprintf(sendBuf,"Welcome%stohere!",inet_ntoa(addrClient.sin_addr)); send(sockConn,sendBuf,strlen(sendBuf)+1,0);hThread=CreateThread(NULL,0,RecvProc1,NULL,0,NULL);}DWORDWINAPIRecvProc1(LPVOIDlpParameter){ charb[50]="QUIT"; while(1) { charrecvBuf[50]; recv(sockConn,recvBuf,50,0); if(strlen(recvBuf)==4&&recvBuf[0]==b[0]&&recvBuf[1]==b[1]&&recvBuf[2]==b[2]&&recvBuf[3]==b[3]) { HWNDhWnd=GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_EDIT1); sbuf+="对方已经断开连接!\r\n"; CWnd*pWnd=CWnd::FromHandle(hWnd); pWnd->SetWindowText(sbuf); return0; } sbuf+="friend:\r\n"; sbuf+=recvBuf; sbuf+="\r\n"; HWNDhWnd=GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_EDIT1); CWnd*pWnd=CWnd::FromHandle(hWnd); pWnd->SetWindowText(sbuf); } return0;}链接服务器函数:voidCChatDlg::OnButton1(){ //TODO:Addyourcontrolnotificationhandlercodehere CWnd*subWnd; WORDwVersionRequested; WSADATAwsaData; interr; wVersionRequested=MAKEWORD(1,1); err=WSAStartup(wVersionRequested,&wsaData); if(err!=0) { return; } if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1) { WSACleanup(); return; }sockConn=socket(AF_INET,SOCK_STREAM,0); CStringport; subWnd=GetDlgItem(IDC_EDIT3); subWnd->GetWindowText(port); UINTintport=UINT(atoi(LPCSTR(port))); CStringip; subWnd=GetDlgItem(IDC_EDIT2); subWnd->GetWindowText(ip); charsIp[16];strncpy(sIp,LPCSTR(ip),16); addrSrv.sin_addr.S_un.S_addr=inet_addr(sIp); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(intport); if(connect(sockConn,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))==SOCKET_ERROR) MessageBox("连接失败"); else{ MessageBox("连接成功"); charrecvBuf[50]; recv(sockConn,recvBuf,50,0); sbuf+="server:\r\n"; sbuf+=recvBuf; sbuf+="\r\n"; subWnd=GetDlgItem(IDC_EDIT1); subWnd->SetWindowText(sbuf); send(sockConn,"客户端链接成功!",strlen("客户端链接成功!")+1,0); HANDLEhThread=CreateThread(NULL,0,RecvProc1,NULL,0,NULL); }}发送消息函数:voidCChatDlg::OnButton3(){ CWnd*subWnd; CStringsendBuf1; subWnd=GetDlgItem(IDC_EDIT4); subWnd->GetWindowText(sendBuf1); subWnd->SetWindowText(NULL); sbuf+="I:\r\n"; sbuf+=sendBuf1; sbuf+="\r\n"; send(sockConn,sendBuf1,strlen(sendBuf1)+1,0); subWnd=GetDlgItem(IDC_EDIT1); subWnd->SetWindowText(sbuf); }退出函数:voidCChatDlg::OnButton5(){ //TODO:Addyourcontrolnotificationhandlercodehere CStringsendBuf; sendBuf="QUIT"; send(sockConn,sendBuf,strlen(sendBuf)+1,0); closesocket(sockConn); WSACleanup(); AfxGetMainWnd()->SendMessage(WM_CLOSE);}附录二:#include"Ping.h"intmain(intargc,char*argv[]){ if(argc==1) { usageinfo(argv[0]); return-1; } BOOLbRecordRout=FALSE; SOCKEThSocket=INVALID_SOCKET; SOCKADDR_INdstSin; SOCKADDR_INfromSin; IP_OPT_HEADERipOptHeader; char*pIcmpData=NULL; char*pRecvData=NULL; char*lpDstIp=NULL; intdatasize=DEF_PACKET_SIZE; intret; intrcvNum; for(inti=1;i<argc;i++) { if(strchr(argv[i],'-')) { switch(tolower(argv[i][1])) { case'r': bRecordRout=TRUE; break; case'd': datasize=atoi(argv[i+1]); i=argc+1; break; } } elseif(strchr(argv[i],'.')) { intl=strlen(argv[i]); if(l<7||l>15) { usageinfo(argv[0]); } else {lpDstIp=argv[i]; } } } WSADATAwsaData; WORDwVer=MAKEWORD(2,2); if(WSAStartup(wVer,&wsaData)!=0) { printf("WSAStartupError!\n"); return-1; } hSocket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED); if(hSocket==INVALID_SOCKET) { printf("WSASocketError,Code:%d",WSAGetLastError()); WSACleanup(); return-1; } if(bRecordRout) { ZeroMemory(&ipOptHeader,sizeof(ipOptHeader)); ipOptHeader.code=IP_RECORD_ROUTER; ipOptHeader.len=39; ipOptHeader.ptr=4; if((ret=setsockopt(hSocket,IPPROTO_IP,IP_OPTIONS,(char*)&ipOptHeader,sizeof(ipOptHeader)))==SOCKET_ERROR) { printf("setsockopt(IP_OPTIONS)error,code:%d",WSAGetLastError()); WSACleanup(); closesocket(hSocket); return-1; } } inttimeout=1000; if((ret=setsockopt(hSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)))==SOCKET_ERROR) { printf("setsockopt(SO_RCVTIMEO)error,code:%d",WSAGetLastError()); WSACleanup(); closesocket(hSocket); return-1; } if((ret=setsockopt(hSocket,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout)))==SOCKET_ERROR) { printf("setsockopt(SO_SNDTIMEO)error,code:%d",WSAGetLastError()); WSACleanup(); return-1; } pIcmpData=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET_SIZE); pRecvData=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET_SIZE); if(pIcmpData==NULL||pRecvData==NULL) { printf("HeapAllError\n"); WSACleanup(); return-1; } datasize+=sizeof(ICMP_HEADER); ZeroMemory(&dstSin,sizeof(dstSin)); dstSin.sin_family=AF_INET; dstSin.sin_addr.s_addr=inet_addr(lpDstIp); FillIcmpData(pIcmpData,datasize); printf("Ping%swith%dbytesofdata\n",inet_ntoa(dstSin.sin_addr),datasize); intcount=0; intseq=0; rcvNum=0; while(1) { count++; if(count==5) break; ((PICMP_HEADER)pIcmpData)->checksum=0; ((PICMP_HEADER)pIcmpData)->seq=seq++; ((PICMP_HEADER)pIcmpData)->timestamp=GetTickCount(); ((PICMP_HEADER)pIcmpData)->checksum=CheckSum((USHORT*)pIcmpData,datasize); if((ret=sendto(hSocket,pIcmpData,datasize,0,(LPSOCKADDR)&dstSin,sizeof(dstSin)))==SOCKET_ERROR) { if(WSAGetLastError()==WSAETIMEDOUT) { printf("timeout.\n"); continue; } else { printf("sendtoerror,code:%d",WSAGetLastError()); closesocket(hSocket); WSACleanup(); return-1; } } intfromLen=sizeof(fromSin); if((ret=recvfrom(hSocket,pRecvData,MAX_PACKET_SIZE,0,(sockaddr*)&fromSin,&fromLen))==SOCKET_ERROR) { if(WSAGetLastError()==WSAETIMEDOUT) { printf("timeout.\n"); continue; } printf("recvfromfail!\n"); closesocket(hSocket); WSACleanup(); return-1; } rcvNum++; //printf("%d",rcvNum); DecodeIcmpHeader(pRecvData,ret,&fromSin); } printf("\nPingStatiscsfor:%s\n",lpDstIp); printf("\tSend=%d,Received=%d,Lost=%d(%d%%loss)",4,rcvNum,4-rcvNum,(4-rcvNum)/4*100); if(hSocket!=INVALID_SOCKET) closesocket(hSocket); HeapFree(GetProcessHeap(),0,pIcmpData); HeapFree(GetProcessHeap(),0,pRecvData); WSACleanup(); return0; } voidusageinfo(char*progname) { printf("Pingtool,byblode(blode@\n"); printf("usage:ping[-r]<hostip>[-d][datasize]\n"); printf("\t-r:\trecordrouter\n"); printf("\thostip:\thostiptoping\n"); printf("\t-d:\tusedatasizeoption\n"); printf("\tdatasize:\tdatasizetoping(<=1024)\n"); } voidFillIcmpData(char*icmp_data,intsize) { ICMP_HEADER*icmpHdr; icmpHdr=(PICMP_HEADER)icmp_data; icmpHdr->checksum=0; icmpHdr->code=0; icmpHdr->id=(unsignedshort)GetCurrentProcessId(); icmpHdr->seq=0; icmpHdr->type=ICMP_ECHO; icmpHdr->timestamp=0; } USHORTCheckSum(USHORT*buf,intsize) { USHORTcksum=0; while(size>1) { cksum+=*buf++; size-=sizeof(USHORT); } if(size) cksum+=*buf++; cksum=(cksum>>16)+(cksum&0xffff); cksum+=(cksum>>16); return(USHORT)(~cksum); } voidDecodeIcmpHeader(char*buf,intret,LPSOCKADDR_INlpSin) { ICMP_HEADER*icmpHdr; IP_HEADER*ipHdr; intipHdrLen; staticintfirst=0; DWORDtick=GetTickCount(); ipHdr=(IP_HEADER*)buf; ipHdrLen=ipHdr->h_len*4; if(ipHdrLen==60&&!first) DecodeIpHeader(buf,ret); icmpHdr=(ICMP_HEADER*)(buf+ipHdrLen); if(icmpHdr->type!=ICMP_ECHOREPLY) { printf("noechoreply%drecved\n"); return; } if(icmpHdr->id!=(USHORT)GetCurrentProcessId()) { printf("someoneelse'spacket!\n"); return; } printf("Replyfrom:%s",inet_ntoa(lpSin->sin_addr)); printf("\tbytes:%dicmpseq:%dTTL=128",ret,icmpHdr->seq); printf("time:%dms\n",tick-icmpHdr->timestamp); first++; return; } voidDecodeIpHeader(char*buf,intbytes) { IP_OPT_HEADER*ipOptHdr; IN_ADDRin; ipOptHdr=(IP_OPT_HEADER*)(buf+20); printf("RecordReouter:"); for(inti=0;i<(ipOptHdr->ptr/4)-1;i++) { in.S_un.S_addr=ipOptHdr->addr[i]; printf("\t%-15s\n",inet_ntoa(in)); } }Ping.h文件:#defineWIN32_LEAN_AND_MEAN#include<windows.h>//windows下socket通信所必须的函数库#include<winsock2.h>#include<ws2tcpip.h>#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructtagIP_HEADER{ unsignedinth_len:4; unsignedintver:4; unsignedchartos; unsignedshorttotal_len; unsignedshortident; unsignedshortfrag_flags; unsignedcharttl; unsignedcharprotocol; unsignedshortchecksum; unsignedintsourceip; unsignedintdestip;}IP_HEADER,*PIP_HEADER;typedefstructtagIP_OPT_HEADER{ unsignedcharcode; unsignedcharlen; unsignedcharptr; unsignedlongaddr[9];}IP_OPT_HEADER,*PIP_OPT_HEADER;typedefstructtagICMP_HEADER{ unsignedchartype; unsignedcharcode; unsignedshortchecksum; unsignedshortid; unsignedshortseq; unsignedlongtimestamp;}ICMP_HEADER,*PICMP_HEADER;#defineDEF_PACKET_SIZE32#defineMAX_PACKET_SIZE1024#defineICMP_ECHO8#defineICMP_ECHOREPLY0#defineIP_RECORD_ROUTER7voidusageinfo(char*progname);voidFillIcmpData(char*icmp_data,intsize);USHORTCheckSum(USHORT*buf,intsize);voidDecodeIcmpHeader(char*buf,intret,LPSOCKADDR_INlpSin);voidDecodeIpHeader(char*buf,intbytes);附录三:#include<winsock2.h>#include<ws2tcpip.h>#include<stdio.h>#include<stdlib.h>#defineMCASTADDR""#defineMCASTPORT5150#defineBUFSIZE1024intmain(intargc,char**argv){ WSADATAwsd; structsockaddr_inlocal,remote,from; SOCKETsock,sockM; TCHARrecvbuf[BUFSIZE]; intlen=sizeof(structsockaddr_in); intret; if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { printf("WSAStartup()failed\n"); return-1; } if((sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED))== INVALID_SOCKET) { printf("socketfailedwith:%d\n",WSAGetLastError()); WSACleanup(); return-1; } local.sin_family=AF_INET; local.sin_port=htons(MCASTPORT); local.sin_addr.s_addr=INADDR_ANY; if(bind(sock,(structsockaddr*)&local,sizeof(local))==SOCKET_ERROR) { printf("bindfailedwith:%d",WSAGetLastError()); closesocket(sock); WSACleanup(); return-1; } remote.sin_family=AF_INET; remote.sin_port=htons(MCASTPORT); remote.sin_addr.s_addr=inet_addr(MCASTADDR); if((sockM=WSAJoinLeaf(sock,(SOCKADDR*)&remote,sizeof(remote),NULL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025项目管理聘用合同内容
- 《2025自动化设备采购合同》
- 青岛房屋过户合同范本
- 2025《合同法》与企业管理:应对新挑战实现共赢
- 语言艺术训练知到课后答案智慧树章节测试答案2025年春青岛职业技术学院
- 2025授权人力资源服务合同
- 2024年厦门医院招聘事业单位专业技术人员真题
- 2024年南昌市市属事业单位考试真题
- 2024年滦州市市属事业单位考试真题
- 2024年安吉县上墅私立职业高级中学专任教师招聘真题
- c语言程序设计第7章数组课件
- 土地污染及其防治课件
- “科学与文化论著研习”学习任务群的课程论分析
- 幼儿园《角色游戏》课件
- 先心病的护理课件
- 近视眼的防控课件
- 抖音直播运营团队薪酬绩效考核管理方案(直播带货团队薪酬绩效提成方案)
- 压电陶瓷精品课件
- 教学课件·植物组织培养
- 部编版语文一年级下册识字8-人之初市级优质课课件
- 基于仿真的轴承动力学分析设计毕业设计说明书
评论
0/150
提交评论