版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
select多路复用程序设计――――――――――――――――5多线程并发服务器设有限状态机与有状态通信――――――――――――――――――――17基于消息驱动的异步选择机制――――――――――――――――――30服务与协议实【实验目的13【实验意义【实验环境【实验原理recvfromsendto就可直接进行通信,更重要的是,面向连接时应使SOCK_STREAMSOCK_DGRAMconnect等一系列通常在面向连DGRAM套接字尝试建立连接,在通信STREAMrecvfrom和服务可以由另外类型的协议来实现在套接字这个应用和传输层实体之间的(协议数据报套接字的服务由UDP协议提供而字节流套接字的服务则由TCP协议提【实验方法sendtosendto用户选择发送或接收的状态。如果用户选择接收(有两种接收方式供选择recvrecvfrom则程序会调用recvrecvfrom接收数据,并将接收到的数据打印【实验【实验步骤 下无连接客户机和服务器程序,启动sniffer捕获报1000buffer【记录】客户机sendto执行结果 【记录】服务器recvfrom执行结果 【记录】由sniffer抓取的UDP报要信息(源、目的地址、报文大小1Mbuffer1M【记录】客户机sendto执行结果 【记录】服务器recvfrom执行结果 【记录】由sniffer抓取的报要信息(源、目的地址、报文大小重新启动测试程序,测试接收缓冲区过小。客户机发送1000字节,服务器设置999【记录】客户机sendto执行结果 【记录】服务器recvfrom执行结果 【记录】由sniffer抓取的报要信息(源、目的地址、报文大小测试文的合并情况。客户机连续三次发送,分别10、20和30字节,服务器在客户buffer60字节,并进入接收状态。【记录】客户机3次sendto执行结果 【记录服务器3次recvfrom执行结果 错误类型【记录】由sniffer抓取的报要信息(源、目的地址、报文大小 下面向连接客户机和服务器程序,启动sniffer捕获报1000buffer【记录】客户机send执行结果 【记录】服务器recv执行结果 【记录】由sniffer抓取的报要信息(源、目的地址、报文大小1Mbuffer1M【记录】客户机send执行结果 【记录】服务器recv执行结果 【记录】由sniffer抓取的报要信息(源、目的地址、报文大小重新启动测试程序,测试接收缓冲区过小。客户机发送1000字节,服务器设置999recvfrom【记录】客户机send执行结果 【记录】服务器recv执行结果 【记录】由sniffer抓取的报要信息(源、目的地址、报文大小测试文的合并情况。客户机连续三次发送,分别为10、20和30字节,服务器在客buffer60字节,并进入接收状态。【记录】客户机3次send执行结果 【记录】服务器3次recv执行结果 【记录】由sniffer抓取的报要信息(源、目的地址、报文大小为了便于进行源、目的地址限定的测试,使用3个测试程序,当其中一个与另一个启动“实验环节2.1” 号。启动sniffer捕获报文【记录】程序1的地址和工作端口 【记录】程序2的地址和工作端口 【记录】程序3的地址和工作端口 【记录】由sniffer抓取的报要信息(源、目的地址、报文大小12、3【记录程序1向程序2sendto执行结果 【记录】程序2recvfrom执行结果 【记录程序1向程序3sendto执行结果 【记录】程序3recvfrom执行结果 【记录】由sniffer抓取的报要信息(源、目的地址、报文大小1【记录程序2向程序1sendto执行结果 【记录】程序1recvfrom执行结果 【记录程序3向程序1sendto执行结果 【记录】程序1recvfrom执行结果 【记录】由sniffer抓取的报要信息(源、目的地址、报文大小send、recv函数的参数,得到结论a)在“实验环节 下,分别用两个VC集成环境打开server工程和client工【记录】listen函数的返回值 【记录】accept函数的返回值 ,错误类型 【记录】recv函数的返回值 【记录】connect函数的返回值 【记录】send函数的返回值 a)在“实验环节3.2” 下,分别用两个VC集成环境打开server工程和client工程在面向连接的客户机和服务器程序里,使用sendto函数和recvfrom函数【记录】sendto函数的返回值 ,错误原因 【记录】recvfrom函数的返回值 测试数据报套接字上使用 d等原语对源和目的地址的限定作用 下的3个无连接测试程序,启动sniffer进行报文捕【记录】3个测试程序的地址和工作的端IP端1send【记录】send执行结果 1connect2【记录】connect执行结果 【记录】由sniffer抓取的报要信息(源、目的地址、报文大小1sendconnectsend【记录】send执行结果 【记录】由sniffer抓取的报要信息(源、目的地址、报文大小2recvfrom【记录】recvfrom执行结果: 程序3执行recvfrom【记录】recvfrom执行结果 1sendto3connectsendto【记录】sendto执行结果 【记录】由sniffer抓取的报要信息(源、目的地址、报文大小3recvfrom【记录】recvfrom执行结果: 程序2执行recvfrom【记录】recvfrom执行结果 2sendconnect【记录】程序2执行send结果 2sendtop1【记录】程序2执行sendto结果: 程序1执行recvfrom【记录】程序1执行recvfrom结果: 程序2执行sendto,向p3发送数据【记录】程序2执行sendto结果: 程序3执行recvfrom【记录】程序3执行recvfrom结果 3sendto1【记录】程序3执行sendto结果: 程序1执行recvfrom【记录】程序1执行recvfrom结果: 程序3执行sendto,向p2发送数据【记录】程序3执行sendto结果: 程序2执行recvfrom【记录】程序2执行recvfrom结果 sendtorecvfromS分别运行“实验环节4.2” 下的2个面向连接客户机测试程序c1、c2和服务器s测【记录】3个测试程序的地址和工作的端IP端sc1sendtos【记录】c1执行sendto结果 c1recvfron【记录】c1执行recvfrom结果 ,错误类型 c1connect,与服务器建立连接,c2执行connectc1send,srecv【记录】c1执行send结果 【记录】s执行recv结果 c1sendtos发送数据,srecvfrom【记录】c1执行sendto结果 【记录】s执行recvfrom结果 c1使用sendto向c2发送数据,测试能否向第发送数【记录】c1执行sendto结果 c2【记录】c2执行recvfrom结果 ,错误类型 s【记录】s执行recvfrom结果 c2sendto向c1【记录】c2执行sendto结果 c1【记录】c1执行recvfrom结果 ,错误类型 recvfromsendto,能否获得数据报服务。send、recv send1000recv,buffer【记录】客户机send执行结果 【记录】服务器recv执行结果 send1Mrecv,buffer【记录】客户机send执行结果 【记录】服务器recv执行结果 send1000recv,buffer【记录】客户机send执行结果 【记录】服务器recv执行结果 send310、20、30字节,服务器在recv,buffer60字节【记录】客户机3次send执行结果 【记录】服务器3次recv执行结果 sendto、recvfrom 下面向连接客户机和服务器测试程序recvfrom()1000字节;客sendto()1000字节。【记录】客户机sendto执行结果 【记录】服务器recvfrom执行结果 sendto1Mrecvfrom,buffer大1M【记录】客户机sendto执行结果 【记录】服务器recvfrom执行结果 【记录】客户机sendto执行结果 【记录】服务器recvfrom执行结果 sendto310、20、30字节,服务器recvfrom,buffer60字节【记录】客户机3次sendto执行结果 【记录】服务器recvfrom执行结果 【实验结果分【思考12、为什么对连接关系的限定服务在两种套接字上都可以实现,但字节流服务基于select的多路复用程序设【实验目的select的多路复用程序基本流程【实验意义【实验环境【实验原理1需要利用select函数向系统同时查询多个套接字的状态,当select返回时,会用体的状态采取相应的处理,如逐个从读状态队列上的套接字中数据。readread2并返回一个确认信息,如“ackbyserver服务器不主动关闭套接字。服务器,3可以将多路复用程序结构划分为三个部分:初始化部分,包括建立套接select(}4、多路复用程序的之一--套接字管理队select之前程序都要根据套接字管理队列中的套接字,生成三个状态队select循环结束前需要将上述三个状态队列清空,并重新填充队列内let队列,也就无法同时了解多个套接字的状态,达到多路复用的目的。5、多路复用程序的之二――套接字状态处select则表明有新的连接接入,这时不是调用recv()接收数据,而应该调用 while(}}}}6主套接字能否正常工作:能否进入状态,能否接收新的连7【实验方法【实验步骤1、根据课程和教案的相关内容写出基于select的多路复用服务器程序听套接字,初始化套接字队列;selectselect相关的形成套接字状实现;完成该队列的初始化、、删除和遍历操作。acceptselect(}FD_SETFD_ZEROselectFD_ISSETrebuildall(重构全部)工具对工程进行编译。记录在编译过程中遇到目标:得到正确的套接字标识符,并在绑定后正确地进入状态再逐个查询,最后从队列中删除它们,观察、查询和删除操作下套接字队列【实验结果分(从实验结果分析,究竟多路复用服务的特点是什么?哪些技术是关键【思考1、有人认为,假设套接字s上发生了读事件,是通过select后发现sselect前,s已经在读状态队列上,没队列上加入各套接字。请问,这样做将造成什么样的,试举一例来说明。2、如果把套接字放到写状态队列上,会发现每次select后,各套接字3select及相关机制,该客户机能够达到什么样的功能。换句话说,在哪种情形下,会在客户机程序中设计基于select的【附B//server.cpp#include"winsock.h"#include"stdio.h"#pragmacomment(lib,"wsock32.lib")structsocket_list{SOCKETMainSock;intnum;SOCKETvoidinit_list(socket_list{intlist->MainSock=list->num=for(i=0;i<64;ilist->sock_array[i]=}}voidinsert_list(SOCKETs,socket_list{intfor(i=0;i<64;if(list->sock_array[i]==0){list->sock_array[i]=s;list->num+=1;}}}voiddelete_list(SOCKETs,socket_list{intfor(i=0;i<64;if(list->sock_array[i]==s){list->sock_array[i]=list->num-=1;}}}voidmake_fdlist(socket_list*list,fd_set{intfor(i=0;i<64;i++){if(list->sock_array[i]>}}}intmain(intargc,char*{SOCKETstructsockaddr_inser_addr,remote_addr;intlen;charbuf[128];WSADatawsa;intretval;structsocket_listsock_list;fd_setreadfds,writefds,exceptfds;timevaltimeout;intunsignedlongs=ser_addr.sin_family=AF_INET;ser_addr.sin_port=htons(0x1234);timeout.tv_sec=0;timeout.tv_usec=1;sock_list.MainSock=s;arg=1;retval=select(0,&readfds,&writefds,&exceptfds,&timeout);if(retval==SOCKET_ERROR){retval=WSAGetLastError();}len=sizeof(remote_addr);sock=accept(sock_list.MainSock,(sockaddr*)&remote_addr,&len);if(sock==SOCKET_ERROR)printf("accepta}for(i=0;i<64;i++){if(sock_list.sock_array[i]==0)sock=sock_list.sock_array[i];retval=recv(sock,buf,128,0);if(retval==0){printf("closeasocket\n");}elseif(retval==-retval=WSAGetLastError();if(retval==WSAEWOULDBLOCK)printf("closeasocket\n");}buf[retval]=0;send(sock,"ACKby}}}return}多线程并发服务器设【实验目的123、了解进程(线程)【实验环境【实验原理重复(循环)服务,主线线程的程序设计显得较为简洁。在执行过程中由select机制下的因此六个参数只使用了两个,还有一个是输出参数,其余的3个参数可以填0dwThrdParam=hThread= //nosecurity //usedefaultstack //threadfunction //argumenttothreadfunction //usedefaultcreationflags //returnsthethread3字标识符传递给子线程,让子线程控制这个连接上的通信,使用dwThrdParam参数在主、子线程之间传递套接字标识符。【实验方法在中级阶段的程序中设计主线线程的部分。利用对比实验VCSpy工具观察进程和线程的状态。【实验步骤实验前可先利用MSDN或查阅相关书籍了解本实验的重点实验对象:,创建线程,服务器将在接受每个客户的连接时创建一个新线程,线程执行的线程获得的套接字标识符不同,打印的结果也不同可以通过观察这个结4~5个客户机,观察服务器多线程独,CPUCPU停止测试,回到服务器工程,这一次改变线程执行函数为server_proc(。CPU3CPU利用server_pro(5,体会多线程并发服务的效果。【实验结果分(提示:多线程并发服务的特点【思考1225的实验现象和之前的哪个实验的现象类似?为什么并发服务可以提供3、为什么利用spy看到的COSERVER的线程个数比实际因客户连接而创建的线4有限状态机与有状态通【实验目的【实验环境【实验原理1-正在认证(等待用户名、等待口令ARP2转换:实体从一个状态收到事件激励进入下一个状态,并动作的过程31TCP协议有限状态机1状 事{case1:case1;1;next_state=2;}case}return}4发送方需要对帧进行,接收方会根据帧的序号判断当前帧是否为重复帧,若5本实验的目标是在客户机和服务器之间以停等协议的方式传递一个文件snd.txt(该文件在实验下,客户机发送,服务器接收。实验指导采用字节从文件中最多100字节interror_simulator(intprob)模拟,该函数在发送数据帧/ACK帧1(%)~100(%)之间调整,返回值voiddelay_simulator(intmax_delay)模拟,该函数由接收ACK11秒的延时。调用delay_simulator就进行一段随机延时。随机延时将在0~max_delayACKerror_simulator来模拟信道出错的情况(ACK帧也可能丢失。【实验方法【实验步骤12根据停等协议状态机做出接收方/3,停等协议需要对帧进行可以简单设计帧格式为帧头+数据块,帧多传输100字节。因此可以对数据帧做出如下定义:,structchartype;charsequence_num;01char}}4、程序框架(含事件产生本实验着重通信过程因此关于建立连接及关闭连接的过程就采用之前waiteforaevent;caseX:state=x_fsm(event);caseY:state=…}}select后的读状态队列中,则认为产生了一个接收事件。105.2selecttimeout5select返回值为0时,可以认为在5秒的计时时间内没有事件发生,当然也就没有收到6{caseevent1:…next_state=y;caseevent2:…next_state=}return}7取的动作打印到日志文件—log.txt,可调用实验提供的programlog(char*log_string)VCwindiffsnd.txtrx.txt,判断是否正确接收。还可以结合客户机和服务器的日志PROBDELAY多做几次。89【实验结果分(提示:利用状态机设计、实现有状态通信程序过程中有哪些重要的环节【思考【附件//server.cpp:Definestheentrypointfortheconsole#include"stdafx.h"#include"winsock.h"#include"stdio.h"#include"time.h"#include<sys/timeb.h>#defineSERVER_PORT0x1234#pragmacomment(lib,"wsock32.lib")#define #define #define //definetheprobability#definePROB1#defineTIMEOUT5structPDU{charcharsequence_num;charlen;char#defineHEADSIZE3FILE*Fid,*LogFid;SOCKETs,ns;intintR1_fsm(intevent);intR0_fsm(intevent);intStart_fsm(intevent);voidProgramLog(char*Event,char*Data);voiddelay_simulator(intmaxdelay);interror_simulator(intintmain(intargc,char*{intretval;intunsignedlongfd_setread_list;intevent;WSADatawsa;timevaltimeout;//openlogLogFid=s=server.sin_family=AF_INET;server.sin_addr.S_un.S_addr=htonl(INADDR_ANY);server.sin_port=htons(0x1234);len=ns=accept(s,(sockaddr*)&remote,&len);if(ns<=0)return0;ProgramLog("acceptaarg=1;Fid=fopen("rx.txt","wb");if(Fid==NULL){printf("can`topenfile\n");return0;}timeout.tv_usec=0;retval=select(0,&read_list,NULL,NULL,&timeout);if(retval==SOCKET_ERROR)if(retval==}retval=recv(ns,(char*)&recvbuf,sizeof(recvbuf),0);if(retval<=0){retval=WSAGetLastError();if(retval==WSAEWOULDBLOCK)gotoend;}if(recvbuf.type==if(recvbuf.sequence_num==0){ProgramLog("Recvframe0",NULL);event=EVENT_RECV0;}elseif(recvbuf.sequence_num==1){event=EVENT_RECV1;ProgramLog("Recvframe1",NULL);}}
}
casestate=Start_fsm(event);casestate=R0_fsm(event);casestate=R1_fsm(event);}return0;}intStart_fsm(int{intcaseEVENT_RECV0://sendacksendbuf.type=FRAME_ACK;sendbuf.len=3;if(error_simulator(PROB)==FALSE){ProgramLog("SendACK",NULL);ProgramLog("SendACK","ButcaseEVENT_RECV1://sendacksendbuf.type=FRAME_ACK;sendbuf.len=3;if(error_simulator(PROB)==FALSE){ProgramLog("SendACK",NULL);ProgramLog("SendACK","Butlost");next_state=STATE_RECV1;}return}intR0_fsm(int{intcase//duplicateProgramLog("Dicardframe//sendsendbuf.type=FRAME_ACK;sendbuf.len=3;if(error_simulator(PROB)==FALSE){ProgramLog("SendACK",NULL);ProgramLog("SendACK","ButcaseEVENT_RECV1://sendacksendbuf.type=FRAME_ACK;sendbuf.len=3;if(error_simulator(PROB)==FALSE){ProgramLog("SendACK",NULL);ProgramLog("SendACK","Butlost");next_state=STATE_RECV1;}return}intR1_fsm(int{intcaseEVENT_RECV0://sendacksendbuf.type=FRAME_ACK;sendbuf.len=3;if(error_simulator(PROB)==FALSE){ProgramLog("SendACK",NULL);ProgramLog("SendACK","Butlost");next_state=STATE_RECV0;case//duplicateProgramLog("Dicardframe//sendsendbuf.type=FRAME_ACK;sendbuf.len=3;if(error_simulator(PROB)==FALSE){ProgramLog("SendACK",NULL);ProgramLog("SendACK","But}return}interror_simulator(int{if(rand()*100/RAND_MAX<prob){returnTRUE;}}
returnvoiddelay_simulator(int{//fd_setread_list;intdelay;timevaltimeout;fd_setreadlist;SOCKETss;charss=socket(AF_INET,SOCK_DGRAM,0);delay=rand()*maxdelay/RAND_MAX;c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 意略明京东健康2024布局黄金赛道击破核心靶点-从多维视角出发的偏头痛行业机会洞察报告
- 中考语文一轮复习:议论文知识清单及训练
- 市政工程技术专业毕业论文08486
- 洛阳2024年统编版小学5年级英语第3单元真题
- 生活现象之热现象(二)-2023年中考物理重难点题型专项突破
- 2023年磨边轮资金筹措计划书
- 强化和改进思想政治-2019年范文
- 2024年AG13电喷汽车发动机项目资金需求报告代可行性研究报告
- 2024年航空地面试验设备项目投资申请报告代可行性研究报告
- 【苏科】期末模拟卷01【第1-5章】
- 期中测评试卷(1-4单元)(试题)-2024-2025学年人教版三年级数学上册
- GB/T 15822.1-2024无损检测磁粉检测第1部分:总则
- 2023年全国中学生英语能力竞赛初三年级组试题及答案
- 新质生产力解读课件
- 660MW机组空预器声波吹灰器可行性研究报告最新(精华版)
- 控制柜安装施工方案
- 动车组火灾检测(报警)系统
- 胫腓骨骨折中医护理方案
- 中国工商银行个人贷款申请表版
- 泥塑校本课程
- 装饰施工技术标准及要求
评论
0/150
提交评论