1、网络编程技术实验指导书 计算机网络课程设计-协议设计与编码实现指导书实验1. Windows平台简单套接字编程实验类型:设计性 一、实验环境操作系统:Windows编程工具及集成开发环境:VC+二、实验目的和要求实验目的:掌握Windows平台上简单的客户机端和服务器端的套接字编程。实验要求:(1)在Windows上,编写、编译1个客户机端程序和1个服务器端程序。要求客户机端程序能发送请求给服务器端程序,服务器端程序收到后能发送本机时间给客户机端程序。(2)在相同或不同机子上,先运行服务器端程序可执行文件,后运行客户机端程序可执行文件。TCP/UDP赋予每个服务一个唯一的协议端口号。服务器程序
2、通过协议端口号来指定它所提供的服务,然后被动地等待通信。客户在发送连接请求时,必须说明服务器程序运行主机的IP地址和协议端口号来指定它所希望的服务。服务器端计算机通过此端口号将收到的请求转向正确的服务器程序。大多数网络编程语言都提供或者使用控件封装了套接字应用程序接口(Socket API),应用程序通过套接字接口调用来实现和传输层交互。用户目前可以使用两种套接口,即流套接字TCP和数据报套接字UDP。流式套接字定义了一种可靠的面向连接的服务,提供了双向的,有序的,无重复的数据流服务。数据报套接字定义了一种无连接的服务,支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报
3、套接字接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。套节字API主要包括表1所示的接口。使用面向连接的套接字编程,通过图2来表示其时序。套接字工作过程如下:服务器首先启动,通过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接字后就可调用connect()和服务器建立连接,连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接
4、字。表1 套节字API主要接口接口解释SOCKETBINDLISTENACCEPTCONNETSENDRECVCLOSE创建一个新的套接字给服务器绑定一个传输层地址将服务器设为被动模式接收客户的一个请求客户向服务器发起连接向一个连接的套接字发送数据从一个连接的套接字接收数据终止一个连接图1 面向连接套接口应用程序时序图实验2. 并发套接字编程实验类型:设计性 一、实验环境操作系统:Windows或Linux编程工具及集成开发环境:VC+二、实验目的和要求实验目的:掌握Linux或Windows平台上多线程、多进程或异步I/O的套接字编程。实验要求:(1)在Windows上,编写、编译1个客户机
5、端程序和1个服务器端程序。要求客户机端程序能发送请求给服务器端程序,服务器端程序收到后能发送本机时间给客户机端程序。(2)在相同或不同机子上,先运行服务器端程序可执行文件,后运行客户机端程序可执行文件。可选内容:(1)编写Linux或Windows平台上采取各并发方式的1种程序。(2)测试多线程、多进程或异步I/O的性能。三、实验提示(1)多线程程序编译连接需要用-pthread选项创建TCP并发服务器的算法如下: socket(); /创建一个TCP套接字 bind(); /邦定公认的端口号 listen();/倾听客户端连接 while(1) /开始循环接收客户端的接收 accept();
6、/接收一个客户端的连接 if(fork()=0) /创建子进程 while(1) /子进程处理某个客户端的连接 read(); process(); write(); close(); /关闭子进程处理的客户端连接 exit() ;/终止该子进程 close(); /父进程关闭连接套接字描述符,准备接收下一个客户端连接 TCP并发服务器可以解决TCP循环服务器客户端独占服务器的情况。但同时也带来了一个不小的问题,即响应客户机的请求,服务器要创建子进程来处理,而创建子进程是一种非常消耗资源的操作。多路复用I/O并发服务器:创建子进程会带来系统资源的大量消耗,为了解决这个问题,采用多路复用I/O模
7、型的并发服务器。采用select函数创建多路复用I/O模型的并发服务器的算法如下: 初始化(socket,bind,listen); while(1) 设置监听读写文件描述符(FD_*); 调用select; 如果是倾听套接字就绪,说明一个新的连接请求建立 建立连接(accept); 加入到监听文件描述符中去; 否则说明是一个已经连接过的描述符 进行操作(read或者write); intselect(intn,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);intpoll(structpollfd*
8、ufds,unsignedintnfds,inttimeout);intepoll_wait(intepfd,structepoll_event*events,intmaxevents,inttimeout)实验3. 原始套接字编程实验类型:设计性 一、实验环境操作系统:Windows编程工具及集成开发环境:VC+二、实验目的和要求实验目的:掌握原始套接字编程。实验要求:完成下列功能:(1)利用RAW SOCKET捕获网络数据包的程序模型SOCKET_STREAM 流式套接字 SOCKET_DGRAM SOCKET_RAW 原始套接字 IPPROTO_IP IP协议 IPPROTO_ICMP
9、INTERNET控制消息协议,配合原始套接字可以实现ping的功能 IPPROTO_IGMP INTERNET 网关服务协议,在多播中用到在AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三种套接字类型。SOCK_STREAM也就是通常所说的TCP,而SOCK_DGRAM则是通常所说的UDP,而SOCK_RAW则是用于提供一些较低级的控制的;第3个参数依赖于第2个参数,用于指定套接字所用的特定协议,设为0表示使用默认的协议。 RAW SOCKET能够对较低层次的协议直接访问,网络监听技术很大程度上依赖于它。(2)能够抓取第二节课的并发服务器程序的服务器端
10、或客户端的应用层数据,即:时间值,打印输出。输出示例:Applications+Data: XXXXXXXTransportation+Src Port: XXXXXXDest Port: XXXXXX.Network+Src IP: XXXXXXXDest IP: XXXXXX1引言随着信息技术的快速发展,网络已成为信息交换的主要手段,一些网络新业务在不断地兴起,如电子商务、移动支付等,这些都对网络安全提出了较高的要求。与此同时,黑客对网络的攻击从未停止,网络的安全问题变得日趋严峻。很多网络攻击都是从监听开始的,网络监听最重要一步就是捕获局域网中的数据帧,因此,研究数据捕获技术对于保障网络安
11、全有着重要的意义。2RAW SOCKET简介 同一台主机不同进程可以用进程号来唯一标识,但是在网络环境下进程号并不能唯一标识该进程。TCP/IP主要引入了网络地址、端口和连接等概念来解决网络间进程标识问题。套接字(Socket)是一个指向传输提供者的句柄,TCP/IP协议支持3种类型的套接字,分别是流式套接字、数据报式套接字和原始套接字。流式套接字(SOCKET_STREAM)提供了面向连接、双向可靠的数据流传输服务。数据报式套接字(SOCKET_ DGRAM)提供了无连接服务,不提供无错保证。原始套接字(SOCKET_RAW)允许对较低层次的协议直接访问,比如IP、 ICMP协议,它常用于检
12、验新的协议实现,或者访问现有服务中配置的新设备,因为RAW SOCKET可以自如地控制Windows下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。比如,我们可以通过RAW SOCKET来接收发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定包头或自定协议的IP包。网络监听技术很大程度上依赖于SOCKET_RAW。3RAW SOCKET编程要使用原始套接字,必须经过创建原始套接字、设置套接字选项和创建并填充相应协议头这三个步骤,然后用send、WSASend函数将组装好的数据发送出去。接收的过程也
13、很相似,只是需要用recv或WSARecv函数接收数据。下面介绍使用RAW SOCKET编程的几个步骤。3.1 创建原始套接字 我们可以用socket或WSASocket函数来创建原始套接字,因为原始套接字能直接控制底层协议,因此只有属于“管理员”组的成员,才有权创建原始套接字。下面是用socket函数创建原始套接字的代码。SOCKET sock;Socksocket (AF_INET, SOCK_RAW, IPPROTO_UDP); 上述创建原始套接字的代码使用的是UDP协议,如果要使用其它的协议,比如ICMP、IGMP、IP等协议,只需要把相应的参数改为IPPROTO_ICM、IPPROT
14、O_ IGMP、IPPROTO_IP就可以了。另外,IPPROTO_UDP、IPPROTO_IP、IPPROTO_RAW这几个协议标志要求使用套接字选项IP_HDRINCL,而目前只有Windows 2000和Windows XP提供了对IP_HDRINCL的支持,这意味着在Windows 2000以下平台创建原始套接字时是不能使用IP、UDP、TCP协议的。3.2 设置套接字选项 创建了原始套接字后,就要设置套接字选项,这要通过setsocketopt函数来实现,setsocketopt函数的声明如下:int setsocketopt (SOCKET s,int level,int optn
15、ame,const char FAR *optval,int optlen );在该声明中,参数s是标识套接口的描述字,要注意的是选项对这个套接字必须是有效的。参数Level表明选项定义的层次,对TCP/IP协议族而言,支持SOL_SOCKET、IPPROTO_IP和IPPROTO_CP层次。参数Optname是需要设置的选项名,这些选项名是在Winsock头文件内定义的常数值。参数optval是一个指针,它指向存放选项值的缓冲区。参数optlen指示optval缓冲区的长度3.3 创建并填充相应协议头 这一步就是创建IP和TCP协议头的数据结构,根据相关协议的定义进行编写即可,下面是一个TC
16、P协议头的数据结构。struct TCP unsigned short tcp_sport; unsigned short tcp_dport; unsigned int tcp_seq; unsigned int tcp_ack; unsigned char tcp_lenres; unsigned char tcp_flag; unsigned short tcp_win; unsigned short tcp_sum; unsigned short tcp_urp; ;4一个利用RAW SOCKET捕获网络数据包的程序模型 下面介绍一个利用RAW SOCKET捕获网络数据包的程序模型。这
17、个程序模型演示了如何使用RAW SOCKET捕获局域网中的数据包,它完成了网络底层数据的接收,能显示源地址、目标地址、源端口、目标端口和接收的字节数等信息。这个程序模型也说明了网络监听的基本原理,给捕获局域网中的数据包提供了一种方法,即先把网卡设置为混杂模式,然后利用RAW SOCKET接收IP层的数据。 程序在Visual C+.net 2003中调试并编译通过,运行环境为以太网, 程序代码可同时在Linux与windows环境下编译和运行,当然在编译时需要不同的头文件以及需要对代码作相应的改动。本程序模型在Windows下能直接运行,如果在Linux下运行,则需要先用手工把网卡设置为混杂模
18、式,在root权限下用如下命令设置:ifconfig eth0 promisc。 在Unix/Linux下程序要包含以下这几个进行调用系统和网络函数的头文件:#includestdio.h#includesys/socket.h#includenetinet/in.h#includearpa/inet.h#includeheaders.h为了方便基于Berkeley套接口的已有源程序的移植,Windows Sockets支持许多Berkeley头文件。这些Berkeley头文件被包含在WINSOCK2.H中,所以一个Windows Sockets应用程序只需包含WINSOCK2.H头文件就足够
19、了,这也是目前推荐使用的一种方法。在Windows平台下程序改用以下这几个头文件:#include stdafx.h#include#include#includeheaders.hheaders.h是自己编写的头文件,它的作用是定义IP和TCP包的头结构。在程序中首先定义几个变量和结构,然后调用函数socket()建立socket连接,主要代码如下:int _tmain(int argc, _TCHAR* argv)int sock,bytes_recieved,fromlen;char buffer65535;struct sockaddr_in from;struct ip *ip;st
20、ruct tcp *tcp;sock=socket(AF_INET,SOCK_RAW,IPPROTO_TCP); return 0;程序的第二步用一个while(1)语句来建立一个死循环,用来不停地接收网络信息。首先用函数sizeof()取出一个socket结构的长度,这个参数是recvfrom()函数所必须的。从建立的socket连接中接收数据是通过函数recvfrom()是来实现的,因为recvfrom()函数需要一个sockaddr数据类型,所以用了一个强制类型转换,代码如下:fromlen=sizeof(from);bytes_recieved=recvfrom(sock,buffer
21、,sizeof(buffer),0,(struct sockaddr*)&from,&fromlen);接下来用一条语句把接收到的数据转化为我们预先定义的结构,以便于查看,代码为:ip=(struct ip *)buffer 还要用一条语句来指向TCP头,因为接收的数据中,IP头的大小是固定的4字节,所以用IP长度乘以4就能指向TCP头部分,代码为:tcp=(struct tcp *)(buffer+(4*ip-ip_length) 最后就可以用打印语句把接收的字节数、数据的源地址、目标地址、源端口、目标端口、IP头长度和协议的类型输出来。实验4. FTP综合应用编程实验类型:设计性 一、实验
22、环境操作系统:Windows编程工具及集成开发环境:VC+二、实验目的和要求实验目的:掌握FTP应用编程。实验要求:完成下列功能:(1) 在前三个实验的基础上,将其改造为一个能传输指定文件名称的点对点文件传输软件(2) 设计并实现一个支持多个客户端的文件传输服务器(3) 客户端等待键盘输入文件名称,然后将文件名称传输给服务器,服务器在预先设置好的文件夹下查找该文件,如果发现同名文件,开始传输回客户端,客户端接收完文件后将文件以输入的文件名称保存在本地某个目录即可,否则告诉客户端文件不存在。注意事项:(1) 可以事先在服务器上的某个目录存放一些已经名称的文件,用作客户端指下载。 附录1. 程序评
23、分标准 1程序功能和原理(40)-把具体要求分解,思路正确 2程序质量(40%) (1)用大括号和缩进来清楚地显示程序结构。(提示:按一次tab键产生一个缩进) (2)各函数有功能说明和参数说明 (3)每个源程序文件都有说明(比如本程序功能,作者,包含哪些函数) (4)每个函数长度不超过100行 (5)函数、变量取名前后一致并容易理解 (6)对不容易理解的常量、变量和语句有注释(比如全局常量、变量、if语句) (7)是否允许全部合法输入,是否能检测出所有不合理输入 3程序编写和调试综合能力 (20),比如 (1)会单步运行到任何一个语句 (2)单步运行时能查看变量值 4. 3人/组,给出详细的设计说明,并进行代码演示;报优需参加答辩。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1