您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 《网络编程技术》实验指导书
《网络编程技术》实验指导书Lastupdated:1/9/20201《计算机网络》课程设计--协议设计与编码实现指导书实验1.Windows平台简单套接字编程实验类型:设计性一、实验环境操作系统:Windows编程工具及集成开发环境:VC++二、实验目的和要求实验目的:掌握Windows平台上简单的客户机端和服务器端的套接字编程。实验要求:(1)在Windows上,编写、编译1个客户机端程序和1个服务器端程序。要求客户机端程序能发送请求给服务器端程序,服务器端程序收到后能发送本机时间给客户机端程序。(2)在相同或不同机子上,先运行服务器端程序可执行文件,后运行客户机端程序可执行文件。TCP/UDP赋予每个服务一个唯一的协议端口号。服务器程序通过协议端口号来指定它所提供的服务,然后被动地等待通信。客户在发送连接请求时,必须说明服务器程序运行主机的IP地址和协议端口号来指定它所希望的服务。服务器端计算机通过此端口号将收到的请求转向正确的服务器程序。大多数网络编程语言都提供或者使用控件封装了套接字应用程序接口(SocketAPI),应用程序通过套接字接口调用来实现和传输层交互。用户目前可以使用两种套接口,即流套接字TCP和数据报套接字UDP。流式套接字定义了一种可靠的面向连接的服务,提供了双向的,有序的,无重复的数据流服务。数据报套接字定义了一种无连接的服务,支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报套接字接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。套节字API主要包括表1所示的接口。使用面向连接的套接字编程,通过图2来表示其时序。套接字工作过程如下:服务器首先启动,通过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接字后就可调用connect()和服务器建立连接,连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接字。表1套节字API主要接口接口解释SOCKETBINDLISTENACCEPTCONNETSENDRECVCLOSE创建一个新的套接字给服务器绑定一个传输层地址将服务器设为被动模式接收客户的一个请求客户向服务器发起连接向一个连接的套接字发送数据从一个连接的套接字接收数据终止一个连接服务器socket()bind()listen()阻塞,等待客户数据处理服务请求socket()connect()write()客户机请求数据应答数据图2面向连接套接口应用程序时序图read()read()accept()write()建立连接close()close()图1面向连接套接口应用程序时序图实验2.并发套接字编程实验类型:设计性一、实验环境操作系统:Windows或Linux编程工具及集成开发环境:VC++二、实验目的和要求实验目的:掌握Linux或Windows平台上多线程、多进程或异步I/O的套接字编程。实验要求:(1)在Windows上,编写、编译1个客户机端程序和1个服务器端程序。要求客户机端程序能发送请求给服务器端程序,服务器端程序收到后能发送本机时间给客户机端程序。(2)在相同或不同机子上,先运行服务器端程序可执行文件,后运行客户机端程序可执行文件。可选内容:(1)编写Linux或Windows平台上采取各并发方式的1种程序。(2)测试多线程、多进程或异步I/O的性能。三、实验提示(1)多线程程序编译连接需要用-pthread选项创建TCP并发服务器的算法如下:socket(……);//创建一个TCP套接字bind(……);//邦定公认的端口号listen(……);//倾听客户端连接while(1)//开始循环接收客户端的接收{accept(……);//接收一个客户端的连接if(fork(……)==0)//创建子进程{while(1){//子进程处理某个客户端的连接read(……);process(……);write(……);}close(……);//关闭子进程处理的客户端连接exit(……);//终止该子进程}close(……);//父进程关闭连接套接字描述符,准备接收下一个客户端连接}TCP并发服务器可以解决TCP循环服务器客户端独占服务器的情况。但同时也带来了一个不小的问题,即响应客户机的请求,服务器要创建子进程来处理,而创建子进程是一种非常消耗资源的操作。多路复用I/O并发服务器:创建子进程会带来系统资源的大量消耗,为了解决这个问题,采用多路复用I/O模型的并发服务器。采用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*ufds,unsignedintnfds,inttimeout);intepoll_wait(intepfd,structepoll_event*events,intmaxevents,inttimeout)实验3.原始套接字编程实验类型:设计性一、实验环境操作系统:Windows编程工具及集成开发环境:VC++二、实验目的和要求实验目的:掌握原始套接字编程。实验要求:完成下列功能:(1)利用RAWSOCKET捕获网络数据包的程序模型SOCKET_STREAM流式套接字SOCKET_DGRAMSOCKET_RAW原始套接字IPPROTO_IPIP协议IPPROTO_ICMPINTERNET控制消息协议,配合原始套接字可以实现ping的功能IPPROTO_IGMPINTERNET网关服务协议,在多播中用到在AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三种套接字类型。SOCK_STREAM也就是通常所说的TCP,而SOCK_DGRAM则是通常所说的UDP,而SOCK_RAW则是用于提供一些较低级的控制的;第3个参数依赖于第2个参数,用于指定套接字所用的特定协议,设为0表示使用默认的协议。RAWSOCKET能够对较低层次的协议直接访问,网络监听技术很大程度上依赖于它。(2)能够抓取第二节课的并发服务器程序的服务器端或客户端的应用层数据,即:时间值,打印输出。输出示例:Applications++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Data:XXXXXXXTransportation++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++SrcPort:XXXXXXDestPort:XXXXXX………….Network+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++SrcIP:XXXXXXXDestIP:XXXXXX1引言随着信息技术的快速发展,网络已成为信息交换的主要手段,一些网络新业务在不断地兴起,如电子商务、移动支付等,这些都对网络安全提出了较高的要求。与此同时,黑客对网络的攻击从未停止,网络的安全问题变得日趋严峻。很多网络攻击都是从监听开始的,网络监听最重要一步就是捕获局域网中的数据帧,因此,研究数据捕获技术对于保障网络安全有着重要的意义。2RAWSOCKET简介同一台主机不同进程可以用进程号来唯一标识,但是在网络环境下进程号并不能唯一标识该进程。TCP/IP主要引入了网络地址、端口和连接等概念来解决网络间进程标识问题。套接字(Socket)是一个指向传输提供者的句柄,TCP/IP协议支持3种类型的套接字,分别是流式套接字、数据报式套接字和原始套接字。流式套接字(SOCKET_STREAM)提供了面向连接、双向可靠的数据流传输服务。数据报式套接字(SOCKET_DGRAM)提供了无连接服务,不提供无错保证。原始套接字(SOCKET_RAW)允许对较低层次的协议直接访问,比如IP、ICMP协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为RAWSOCKET可以自如地控制Windows下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。比如,我们可以通过RAWSOCKET来接收发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定包头或自定协议的IP包。网络监听技术很大程度上依赖于SOCKET_RAW。3RAWSOCKET编程要使用原始套接字,必须经过创建原始套接字、设置套接字选项和创建并填充相应协议头这三个步骤,然后用send、WSASend函数将组装好的数据发送出去。接收的过程也很相似,只是需要用recv或WSARecv函数接收数据。下面介绍使用RAWSOCKET编程的几个步骤。3.1创建原始套接字我们可以用socket或WSASocket函数来创建原始套接字,因为原始套接字能直接控制底层协议,因此只有属于“管理员”组的成员,才有权创建原始套接字。下面是用socket函数创建原始套接字的代码。SOCKETsock;Sock=socket(AF_INET,SOCK_RAW,IPPROTO_UDP);上述创建原始套接字的代码使用的是UDP协议,如果要使用其它的协议,比如ICMP、IGMP、IP等协议,只需要把相应的参数改为IPPROTO_ICM、IPPROTO_IGMP、IPPROTO_IP就可以了。另外,IPPROTO_UDP、IPPROTO_IP、IPPROTO_RAW这几个协议标志要求使用套接字选项IP_HDRINCL,而目前只有Windows2000和WindowsXP提供了对IP_HDRINCL的支持,这意味着在Windows2000以下平台创建原始套接字时是不能使用IP、UDP、TCP协议的。3.2设置套接字选项创建了原始套接字后,就要设置套接字选项,这要通过setsocketopt函数来实现,setsocketopt函数的声明如下:intsetsocketopt(SOCKETs,intlevel,intoptname,constcharFAR*optval,intoptlen);在该声明中,参数s是标识套接口的描述字,要注意的是选项对这个套接字必须是有效的。参数Level表明选项定义的层次,对TCP/IP协议族而言,支持SOL_SOCKET、IPPROTO_IP和IPPROTO_CP层次。参数Optname是需要设置的选项名,这些选项名是在Winsock头文件内定义的常数值。参数optval是一个指针,它指向存放选项值的缓冲区。参数optlen指示optval缓冲区的长度3.3创建并填充相应协议头这一步就是创建IP和TCP协议头的数据结构,根据相关协议的定义进行编写即可,下面是一个TCP协议头的数据结构。structTCP{unsignedshorttcp_sport;unsignedshorttcp_dport;unsignedinttcp_seq;unsignedinttcp_ack;unsignedchartcp_lenres;unsignedchartcp_flag;unsignedshorttcp_win;un
本文标题:《网络编程技术》实验指导书
链接地址:https://www.777doc.com/doc-2817384 .html