1、中原工学院课程设计专用纸一、 课程设计目的及要求1设计目的(1)提高和加强学生对于网络的基础理论的理解,了解基于socket 的 C/S 编程的概念。(2)培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。(3)学习和掌握使用 socket 开发程序的方法以及上机调试技巧,了解常见的 socket 开发模式的使用。2设计具体内容及要求(1)网络图书查询系统图书信息包括:登录号、书名、作者名、出版单位、出版时间、价格。试设计一图书信息查询系统,使之能提供以下功能: 客户可以远程登录服务器 图书信息浏览功能 查询功能,按书名查询和按作者名查询或价格查询 服务
2、器的工作模式为并发(2)ICMP 协议的应用基于 Winsock 编程技术,使用原始套接口进行程序设计,针对 ICMP 协议进行网络编程,通过调用基本函数,发送不同种类的 ICMP 报文,实现 ping 命令,对网络中某个地址进行实测,验证可用性。二、课程设计具体实现中原工学课程设计专用纸21、总体设计(一)网络图书查询系统(1).总体思想首先分别定义了客户端和服务器端程序,在服务器端定义了两个套接字 s1、s2。s 1 用于监听用户,s2 用于接受客户端的请求连接,只要有客户请求连接,服务器就接受连接;客户端建立了一个用于请求连接的套接字。在连接成功后,请求的客户端就向服务器发送“buf”
3、,服务器端也用一个“buf”接收。并对接受结果进行判断并选择,若“buf=1” ,则执行“按图书名查询”的功能,并将查询结果发送给客户端并显示出来。若“buf=2” ,则执行, “按作者名查询”的功能,并将查询结果发送给客户端并显示出来。若“buf=3” 则,执行“浏览所有图书”的功能,将所有图书的信息发送给客户端并显示出来。而且,服务器能够实现一次处理多个用户请求功能。(2).主要函数定义打开 WinsockWSAStartup()创建套接口socket()指定本地地址bind()客户端请求连接connect()服务器接受连接accept()在已建立连接的套接口上接收数据recv()在已建立
4、连接的套接口上发送数据send()关闭套接口closesocket()中原工学课程设计专用纸3终止使用 WinsockWSACleanup()图书结构体的定义struct Bookint num; char bookname40; char authorname20;char place40; char time10; double price;(3).主程序模块服务器端:void main()定义图书总数量 Book book100;输出图书编号;定义现有的 5 本图书,给结构体的每个变量赋值;打开 winsock;创建套接字 s1 ,s2;建立服务器端地址;进入监听状态;While(无限循
5、环) 接受用户的连接请求;While(无限循环) 接收用户发送的 buf;if(命令 1)中原工学课程设计专用纸4接收客户端发送的书名;将接受的书名和每一本书的书名进行比较;将比较结果相同的书的所有信息发送给客户端;else if(命令 2)接收客户端发送的作者名;将接受的书名和每一本书的作者名进行比较;将比较结果相同的书的所有信息发送给客户端;else if(命令 3) for(循环 5 次) 发送图书的所有信息;关闭套接口 s2;关闭套接口 s1;终止使用 winsock;客户端:void main()打开 winsock;中原工学课程设计专用纸5创建套接字 s;建立服务器端地址;请求与服
6、务器端建立连接;While(1)进入主菜单;if(命令 1)输入要查询的书名;发送给服务器端;接收服务器返回的结果;在屏幕上显示结果;if(命令 2)输入要查询的作者名;发送给服务器端;接收服务器返回的结果;在屏幕上显示结果;if(命令 3)for(循环 5 次) 接收图书的所有信息;在屏幕上显示所有图书信息;中原工学课程设计专用纸6返回到主菜单;关闭套接口 s;终止使用 winsock;(二) ICMP 协议的应用(1).总体思想首先在头文件里定义 IP 和 ICMP 协议头,定义回送请求和应答数据包的结构。在主函数中初始化 Winsock 协议栈,创建一个原始套接口,并设置目标套接口地址,
7、然后控制程序进行 4次发送与接收的测试,如果等待一段时间,没有接收到应答报文,表示目标主机不可达。然后计算传输时间,并输出提示信息,最后关闭原始套接口,释放 Winsock 协议栈。(2).主要函数定义打开 WinsockWSAStartup()创建套接口socket()在已建立连接的套接口上发送数据sendto()在已建立连接的套接口上接收数据recvfrom()关闭套接口closesocket()关闭套接口closesocket()终止使用 WinsockWSACleanup()计算时间GetTickCount ()计算校验和in_cksum()中原工学课程设计专用纸7状态查询select
8、()(3).主程序模块void main()创建套接字 rawSocket;打开 winsock;建立目标套接口地址;for(循环 4 次)发送 ICMP 回送请求;等待接收回送的数据;接收应答;计算传输时间;输出提示信息;2 详细设计(一)网络图书查询系统 查询功能客户端从键盘输入 1 或 2,选择查询方式,并将输入的 1或 2 定义成一个 buf,然后发送给服务器。同样,服务器用一个buf 接收,并对接收结果判断是 1 或 2,以此按不同的方式查找客户端所需的结果,并发送给客户端,客户端接收再显示到屏幕上。中原工学课程设计专用纸8客户端:if(a=1) int b=10;/给服务器发送 b
9、uf,服务器以此判断执行相应的功能isend=send(s,buf1,sizeof(buf1),0);coutbname;/将客户输入的书名发送给服务器isend=send(s,bname,sizeof(bname),0);/接收服务器返回的信息iRev=recv(s,(char*)if(iRev=0)return;else if(iRev=SOCKET_ERROR)printf(“recv()failed:%dn“,WSAGetLastError();return;;coutaname;/将客户输入的作者名发送给服务器isend=send(s,aname,sizeof(aname),0);/
10、接收服务器返回的信息iRev=recv(s,(char*)if(iRev=0)return;else if(iRev=SOCKET_ERROR)printf(“recv() failed:%dn“,WSAGetLastError();return;cout“书号:“bookm.num“n“书名:“bookm.bookname“n“作者名:“bookm.authorname“n“出版社:“bookm.place“n“价格:“bookm.price“n“出版时间:“bookm.timeendl;以下是服务器端程序:/接收客户端发送的 bufirev=recv(s2,buf,sizeof(buf),
11、0);中原工学课程设计专用纸10/按书名查询if(strcmp(buf,“1“)=0) /buf 为 1 时执行以下功能 /接收客户端发送的书名irev=recv(s2,bookname,sizeof(bookname),0);if(irev=0)return;else if(irev=SOCKET_ERROR)printf(“socket() failed:%dn“,WSAGetLastError();return;printf(“%sn“,bookname);int i;/循环将接收的书名和每本图书名进行比较for(i=0;i5;i+)if (strcmp(bookname,booki.bookname)=0)break;/将比较结果相等的图书信息发送给客户端isend=send(s2,(char*)printf(“按书名查询结果已发送!n“);/按作者名查询