计算机网络课程设计报告
- 格式:wps
- 大小:511.00 KB
- 文档页数:22
计算机网络 课程设计报告
姓 名: 学 号: 班 级: 指导老师:
湖南科技大学计算机科学与工程学院 2013年6月 目录 一、课程设计目的...................................1 二、课程设计内容...................................1 三、课程设计题目...................................2 四、网络聊天程序设计...............................2 五、Ping程序设计..................................5 六、基于IP多播的网络会议程序........................6 七、心得体会.......................................8 八、参考文献.......................................8 九、附录(源代码)...................................8 1
一、课程设计目的 1. 加深对计算机网络通信的工作原理的理解。 通过编写计算机程序实现、模拟网络的某些功能,使学生理解并掌握计算机网络的基本原理及工作过程。 2.实现应用程序进程跨网络的通信 了解系统调用和应用编程接口基本知识,理解应用程序和操作系统之间传递控制权的机制,掌握套接字的创建和运用,通过socket系统调用实现跨网络通信。 3.提高网络编程和应用能力 提高实际编程能力和灵活运用所学知识解决的能力。培养调查研究、查阅技术文献、资料、手册以及编写技术文档的能力,理论应用于实践的能力。 二、课程设计内容 1.网络聊天程序的设计与实现 了解socket通信的原理,在此基础上编写一个一个聊天程序。 2.Ping程序设计与实现 了解ping程序的实现原理,并调试通过。 3.基于IP多播的网络会议程序 由sender和receiver两个程序组成,sender用户从控制台输入多播发送数据,receiver端都要求加入同一个多播组,完成sender发送的多播数据。 2
三、课程设计题目 1.聊天程序设计与实现 2.Ping程序设计与实现 3.基于IP多播的网络会议程序设计 四、网络聊天程序设计 4.1 设计步骤 服务器端编程的步骤: 1.加载套接字库,创建套接字(WSAStartup()/socket()); 2.绑定套接字到一个IP地址和一个端口上; 3. 将套接字设定为监听模式等待连接请求(listen()); 4.请求到来后,接受链接请求,返回一个新的应对于此次链接 的套接字(accept()); 5.返回套接字和客户端进行通信(send()/recv()); 6.返回,等待另一个连接请求; 7.关闭套接字,关闭套接字库(closesocket()WSACleanup())。 客户端编程步骤: 1.加载套接字库,创建套接字(WSAStartup()/socket()); 2.向服务端发出链接请求(connect()); 3.和服务端进行通信(send()/recv()); 4.关闭套接字,关闭套接字库(closesocket()/WSACleanup()) 4.2调试过程 该程序是用c++编写的,用MFC做的界面,首先,我先用c++ 3
编写一个客户端和一个服务器端,代码主要是参照了实验说明书上的,在此基础上稍做了些修改,实现一个简单客户端与服务端通信。在实现过程中出现了问题,后来通过网上查资料和请教别人解决了。例如:与没有链接ws2_32.lib的库文件,是程序编译时出现错误;还有由于我用的是TCP协议通讯,它一次只接收一个数据包,这样就只能实现点对点通信,而不能异步通信,后来,我通过一个简单的线程解决了该问题;另外,在使用MFC封装的时候,由于服务端要使用监听模式,当没有收到连接请求时,会出现阻塞现象,也是用进程解决的。 4.3 设计结果和结果分析 该程序的最终结果是一个可以在局域网内进行简单异步通信 的程序,如下图所示: 4 分析:该聊天程序的最终结果如上图所示,由一个界面构成,一个端口作为客户端,一个端口作为服务端,连接成功后,就可以在输入框里进行聊天,然后显示在一个显示框里。主要的缺点是,只能实现一对一的聊天,不能够实现一对多的。 另附源代码于附录一 5
五、Ping程序设计与实现 5.1设计步骤 1.熟悉IP及ICMP协议的工作机制。 2.熟悉RAW模式的SOCKET编程。 3.编写Ping的实现程序。 4.编译环境中需要包括的SOCKET库win2_32.lib。 5.调试并运行自己编写的Ping程序。 5.2调试过程 该程序是用c++在VC 6.0下实现的,在编写过程中,出现了各种问题,因为该程序相对来说比较复杂,要实现查询指定IP的是否在线、还有它的路由号和传送的数据大小。由于对IP和ICMP协议的使用还不是很熟练,在实现过程中,虽然了解其主要的原理,但是总会出现一些细节方面的错误,使程序无法编译通过,再经过仔细检查之,终于成功实现了。 5.3设计结果及结果分析 在编译通过后,就可以调用该程序保存目录下的可执行文件了,通过命令提示符来操作,具体结果如下图所示: 6
分析:如上图所示,该程序是我自己编写的一个实现Ping的功能的程序,它的功能主要有三个,通过令:ping 10.1.13.239可以查询该IP是否在线,还有-r,-d两个命令是查找目的地址的如有何发送数据报的大小的。 源代码另附于附录二 六、基于IP多播的网络会议程序 6.1设计步骤 1.启动Visual c++6.0,创建一个控制台项目工程,在此工程下添加Sender和Receiver两个项目。 Receiver项目实现步骤: (1)、创建一个SOCK_DGRAM类型的Socket。 (2)、将此socket绑定到本地的一个端口上,为了实现接 收服务器端发送的多播数据。 (3)加入多播组。 7
(4)接受多播数据。 Sender实现步骤: (1)、创建一个SOCK_DGRAM类型的Socket。 (2)、加入多播组。 (3)、发送多播数据。 然后运行各自的程序,进行调试。 6.2调试过程 该程序至少需要在两台机器上进行测试,因为要有一个发送方和一个接收方,发送方执行Sender项目,接受方执行Reciever项目,然后看是否能正常发送和接受。 6.3调试结果及结果分析。 该程序的最终目的是实现多播,就是能同时给多带计算机发送消息,运行结果如下图所示:
以上两个图就是该程序运行时的结果,一方法送,另一方接收, 并显示其IP地址,但还有一些不足只处,没能将它整合成一个即 8
能接收又能发送消息的,并有界面的设计。 源代码另附于附录三。 七、心得体会 通过本次课程设计,我收获了不少东西, 通过编写计算机程序实现、模拟网络的一些功能,使我理解并掌握计算机网络的基本原理及工作过程。对系统调用和应用编程接口基本知识更加熟悉,了解了应用程序和操作系统之间传递控制权的机制,并掌握了套接字的创建和运用,通过socket系统调用实现跨网络通信。 同时提高了我实际编程能力和灵活运用所学知识解决的能力。 让我提高了自己调查研究、查阅技术文献、资料、手册以及编写 技术文档的能力,理论应用于实践的能力。 八、参考文献 [1].谢希仁,计算机网络(第五版),电子工业出版社,2008。 [2].百度 http://www.baidu.com [3]计算网络课程设计指导书。 九、附录 附录一:聊天程序源代码 附录二:Ping程序源代码 附录三:IP多播的网络会议程序源代码 9
附录一: 创建服务器函数: void CChatDlg::OnCreateServer() {
// TODO: Add your control notification handler code here CWnd *subWnd; CString port;
subWnd=GetDlgItem(IDC_EDIT5); subWnd->GetWindowText(port); UINT intport=UINT(atoi(LPCSTR(port))); WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested=MAKEWORD(1,1); err=WSAStartup(wVersionRequested,&wsaData); if(err!=0) { return; } if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1) { WSACleanup(); return; } SOCKET sockSrv=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); int ret=bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); listen(sockSrv,5); int len=sizeof(SOCKADDR); sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); char sendBuf[50]; sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr)); send(sockConn,sendBuf,strlen(sendBuf)+1,0); hThread=CreateThread(NULL,0,RecvProc1,NULL,0,NULL); } DWORD WINAPI RecvProc1(LPVOID lpParameter) { char b[50]="QUIT"; while(1)