网络程序设计
实验报告
实验名称:__I/O模型网络程序实验_________
实验成绩:__________________________
一、实验目的
●掌握Winsock I/O模型工作原理;
●熟悉I/O模型中使用的Winsock接口函数;
●掌握使用I/O模型进行网络程序设计的编程步骤;
二、实验设计
Windows套接字工作模式
Windows套接字工作模式分为两类:阻塞(Blocking)模式和非阻塞(NonBlocking)模式。
在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回(将控制权交还给程序),这就意味着任一个线程在某一时刻只能执行一个输入/输出(I/O)操作,而且应用程序很难同时通过多个建好连接的套接字进行通信。正如我们在以前的实验中看到的,服务端或客户端在运行到recv()函数时会进入阻塞状态,直到对方响应时(即运行了send()函数后)才能继续执行下去。在默认的情况下,套接字工作在阻塞模式。
在非阻塞模式下,Winsock函数会立即返回,并交出程序的控制权,这就为我们实际需要中同时管理多个连接、并维持与每个连接的及时通信提供了基础。在实际问题中,Winsock 编程经常需要使用多线程的方法使程序对用户的动作进行及时响应,但会增加一些开销,并且扩展性比较差。尽管非阻塞模式套接字在使用上不如阻塞套接字简单,但它在功能上还是非常强大的,同时简化了我们针对实际问题的编程过程。
Winsock I/O模型
1)选择模型(Select Model)
2)异步选择模型(WSAAsyncSelect Model)
3)事件选择模型(WSAEventSelect Model)
4)重叠模型(Overlapped Model)
5)完成端口模型(Completion Port Model)
本实验是采用事件选择模型(WSAEventSelect)对程序进行编辑
WSAEventSelect模型是与WSAAsyncSelect模型类似,允许应用程序在一个或多个套接字上接收以事件为基础的网络事件通知,并且支持的网络事件与WSAAsyncSelect模型一样。与WSAAsyncSelect模型的主要区别在于网络事件会被发送到一个事件对象句柄,而不是发送到一个窗口。
WSAEventSelect函数原型如下:
int WSAEventSelect( SOCKET s, WSAEVENT hEventObject,long lNetworkEvents );
使用WSAEventSelect模型编程的基本步骤:
1.创建一个事件句柄表和一个对应的套接字句柄表。
2.每创建一个套接字,就创建一个事件对象,把它们的句柄分别放入上面的两个表中,
并调用WSAEventSelect将二者关联起来。
3.调用WSAWaitForMultipleEvents在所有事件对象上等待(bWaitAll = FALSE),函
数返回后,从第一个有信号的事件对象开始检查事件对象表中的事件对象是否有信
号(再次调用WSAWaitForMultipleEvents )。
4.调用WSAEnumNetworkEvents(),获取套接字上相应的网络事件并处理,然后继
续在事件对象上等待。
实验内容
1、在上述I/O模型中自选一个I/O模型,构建一个TCP服务器,该服务器能:
接受客户端连接时显示客户端的IP,PORT信息
接收客户端连接时显示其连接编号,客户端退出时显示关闭的连接编号
能显示客户端发来的数据
能从键盘输入数据并发到客户端
其他数据传送功能(可选)
2、编写客户端程序,使之能:
从键盘输入数据并发送到服务器
能接收服务器发来的数据
当输入“bye”时退出程序
三、实验过程(包含实验结果)
1、编写客户端以及服务器端,并使之可以通信。
2、在服务器端添加现实客户端IP,PORT信息以及连接编号的功能。
3、在服务器端现实客户端发送的数据,并添加send()函数实现发送功能。
4、在客户端添加输入数据以及现实数据的接受并打印。
四、讨论与分析(思考题:)
1、你所选用的I/O模型是如何判断套接字上何时可以收发数据的或者数据收发已完成的?
答:事件选择模型是以事件对象来通知接受和发送数据的
2、简述你所使用的I/O模型的编程步骤。
答:我使用的是事件选择模型。
步骤:a、创建一个事件句柄表和一个对应的套接字句柄表。
b、每创建一个套接字,就创建一个事件对象,把它们的句柄分别放入上面的两个表中并调用WSAEventSelect添加它们的关联。
c、调用WSAWaitForMultipeEvent在所有事件对象上等待,此函数返回后,我们对事件句柄表中的每个事件调用WSAWaitForMultipeEvent函数,以便确认在哪些套接字上发生了网络事件。
d、处理发生的网络事件,继续在事件对象上等待。
3、在你所使用的I/O中如何判断发生网络事件或者IO完成的套接字?
答:WSAWaitForMultipeEvent判断,WSAWaitForMultipeEvent函数会等待网络事件的发生
五、实验者自评(从实验设计、过程、对实验知识点的理解上给出客观公正的自我评价)
在这次实验我知道了winsock I/O的工作原理,并熟悉了如何使用接口函数,对windows套接字的模式有了更清晰的认识。
六、附录:关键代码(给出适当注释,可读性高)
服务器:
#include
#include
#pragma comment (lib,"ws2_32")
int main(){
unsigned short dWsa=MAKEWORD(2,2);
WSADATA lpwsadata;
if( 0 != WSAStartup(dWsa,&lpwsadata)) cout<<"error";
else
cout< if(sListen == INVALID_SOCKET) { cout<<"FAILED SOCKET()";return 0; }sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(5555); saddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); if (bind(sListen,(LPSOCKADDR)&saddr,sizeof(saddr)) ==SOCKET_ERROR){ cout<<"failed bind()"; return 0; } listen(sListen,5); int totalevent=0; //数组保存; SOCKET SOCKETARRAY[WSA_MAXIMUM_WAIT_EVENTS]; WSAEVENT EVENTARRAY[WSA_MAXIMUM_WAIT_EVENTS]; WSAEVENT event=WSACreateEvent(); WSAEventSelect(sListen,event,FD_ACCEPT|FD_CLOSE); EVENTARRAY[totalevent]=event; SOCKETARRAY[totalevent]=sListen; totalevent++; while(1){ int index=WSAWaitForMultipleEvents(totalevent,EVENTARRAY, FALSE,WSA_INFINITE,NULL); index=index-WSA_WAIT_EVENT_0; cout<<"index:"< for(int i=index;i index=WSAWaitForMultipleEvents(1,&EVENTARRAY[i], FALSE,1000,NULL); WSAResetEvent(EVENTARRAY[i]); if(index==WSA_WAIT_FAILED || index==WSA_WAIT_TIMEOUT) {continue;} else { WSANETWORKEVENTS event; WSAEnumNetworkEvents(SOCKETARRAY[i],EVENTARRAY[i], &event); if(event.lNetworkEvents & FD_ACCEPT) { if(event.iErrorCode[FD_ACCEPT_BIT]==0) { sockaddr_in remoteAddr; int iLenRemoteAddr=sizeof(remoteAddr); SOCKET sNew=accept(SOCKETARRAY[i], (sockaddr *)&remoteAddr, &iLenRemoteAddr); if(INVALID_SOCKET == sNew) { cout<<"connect fail!"< } cout<<"connect from :"< <<"socket number is:" < WSAEVENT event=WSACreateEvent(); WSAEventSelect(sNew,event, D_READ|FD_WRITE|FD_CLOSE); SOCKETARRAY[totalevent]=sNew; EVENTARRAY[totalevent]=event;totalevent++; } } else if(event.lNetworkEvents & FD_READ) { if(event.iErrorCode[FD_READ_BIT]==0) { cout <<"sock " < char buffer[1024]; int ret =recv(SOCKETARRAY[i],buffer,strlen(buffer),NULL); if(ret>0) { buffer[ret]='\0'; cout< cin>>buffer; send(SOCKETARRAY[i],buffer,strlen(buffer),0); cout<<"send error "< }}}}}}} WSACleanup(); return 0;} 客户端:#include #include #pragma comment (lib,"ws2_32") int main(){ unsigned short dWsa=MAKEWORD(2,2); WSADATA lpwsadata; if( 0 != WSAStartup(dWsa,&lpwsadata)) out<<"error"; else cout< if(sClient == INVALID_SOCKET) { cout<<"FAILED SOCKET()";return 0; } sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(5555); saddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); if( connect(sClient,(sockaddr *)&saddr,sizeof(saddr)) == -1){ cout<<"Failed connect";} while(1) { char buf[1024]; cin>>buf; if(!strcmp(buf,"bye")){ closesocket(sClient); return 0;} send(sClient,buf,strlen(buf),0); int num=recv(sClient,buf,1024,0); if(num>0) { buf[num]='\0'; cout< } } closesocket(sClient); WSACleanup(); return 0; } 实验一 实验名称:不会湿的纸团 实验材料:水槽、塑料袋、玻璃杯、纸、气球、石块。 实验步骤:1、把实验器材摆放整齐, 2、在水槽内倒入适量水(大约一半), 3、把石块放入水中,水位会上升,说明石头要占据一定空间, 4、把纸放进玻璃杯,把杯子倒立垂直放入水中,拿出,发现纸并没有湿, 5、空气把纸和水隔开了, 实验结论:空气是占据一定空间的。 实验二 实验名称:称量气球 实验材料:气球、木条、细线 实验步骤: 1、取一支轻质、粗细均匀的直木条,用确定其中心点,用细线将其悬挂,静止后使直木条恰好 保持水平平衡。 2、将A、B两个质量相等的未充气的气球挂在直木条的两端,静止后直木条恰好保持水平平衡。 3、将A气球拿下,给它充足空气后再挂上,结果A气球一端下沉。 实验结论:空气是有质量的。 实验三 实验名称:蜡烛水泵 实验材料:蜡烛、水、透明盘子、玻璃杯 实验步骤:1、在水中放根点燃蜡烛 2、在上面扣上杯子, 等蜡烛熄灭后,看水升高了多少,升高的高度,和原来空气的高度的比值,就是空气中氧气的含量实验结论:空气中有氧气,且大约占空气的五分之一。 实验四 实验名称:旋转的纸蛇 实验器材:纸片、支架、蜡烛、火柴、剪刀 实验步骤 1.在纸片上画出螺旋纹,用剪刀沿纹路剪出一条纸蛇。 2.把纸蛇挂在支架上。 3.点燃蜡烛,放在纸蛇下面。 4.观察纸蛇的变化。 实验现象:悬挂的纸蛇旋转起来了。 实验结论:热空气会上升,带动纸蛇旋转。 注意事项:蜡烛和纸蛇之间要保持一段距离,以免烧坏纸蛇。 实验五 实验名称:冷热空气的对流 实验器材:两个玻璃杯、玻璃片、打火机、香。 实验步骤:1、把香点燃放入玻璃瓶中,烟雾充满后快速拿出,盖上玻璃片。 2、把另一个玻璃瓶扣在玻璃片上,把玻璃片抽出。 实验现象:烟雾慢慢到了上边的杯子里。 实验结论:热空气上升,冷空气下降。 实验六 温度计的使用方法 测量一杯热水。 画表格 实验七 实验名称:熔化的蜡油 实验材料:火柴、酒精灯、三角架、勺子、蜡烛、夹子。 实验步骤: 1、在勺子上滴上两滴蜡油,要间隔一定距离。 2、把实验装置都装好了,确保桌子上没有纸张后,再点燃酒精灯。 注意事项:1、注意安全,不用手去触摸勺子。2、仔细观察,屏住呼吸,以免灯焰摇动。实验现象:离火焰近的先融化,然后离火远的也融化了。 结论:热总是从较热的一端传向较冷的一端。 实验八 雨和冰霜雾的形成 实验名称:雨的成因模拟实验 实验报告 实验名称 课程名称 ___电子技术基础实验 院系部:专业班级:学生姓名:学号 :同组人:实验台号 :指导教师:成绩:实验日期 : 华北电力大学 实验报告要求: 一、实验目的及要求 二、仪器用具 仪器名称规格/型号数量备注 实验箱1 示波器1 数字万用表1 交流毫伏表1 信号放生器1 三、实验原理 四、实验步骤(包括原理图、实验结果与数据处理) 五、讨论与结论(对实验现象、实验故障及处理方法、实验中 存在的问题等进行分析和讨论,对实验的进一步想法或改进意见。) 六、实验原始数据 一、实验目的及要求: 1.学会放大器静态工作点的调试方法,分析静态工作点对放大器性能的影响。 2.掌握放大器电压放大倍数和最大不失真输出电压的测试方法。 3.悉常用电子仪器及模拟电路实验设备的使用。 二、仪器用具:略 三、实验原理 图 1.2.1为电阻分压式工作点稳定单管放大器实验电路图。 图 1.2.1共射极单管放大器实验电路 在图 1.2.1电路中,当流过偏置电阻R B1和 R B2的电流远大于晶体管VT 的基极电流I B时(一般 5~ 10 倍),则它的静态工作点可用下式估算: R B1U CC I E U U I C CE=U CC-I C(R C+R F1+ R E) U B R B2B U BE R B1R E R F1 电压放大倍数: A Vβ R C //R L 其中 r be= 200+26 (1+β)/I E r be(1)R F 1 输入电阻: R i= R B1 // R B2 // [r be+(1+β)R F1 ] 输出电阻: R O≈ R C 四、实验方法与步骤: 1.调试静态工作点 接通+ 12V 电源、调节R W,使 U E= 2.0V ,测量 U B、 U E、U C、 R B2值。记入表 1.2.1 。 表 1.2.1U= 2.0V E 测量值计算值U B( V)U E( V)U C( V)R B2(KΩ) U BE( V) U CE( V) I C( mA) 2.665 2.07.8530.865 5.2 2.0 根据表格测量数据,计算得到: U=U -U E =0.665V,U = U - U E =5.8V,I ≈ I = U /R =2/(1.1)=1.82mA BE B CE C CE EE 实验数据显示,Q点的值满足放大电路的静态工作点要求,BJT 处于放大区。 2.测量不同负载下的电压放大倍数 高等数学数学实验报告 实验人员:院(系) __ __学号____姓名_ __ 实验地点:计算机中心机房 实验一 空间曲线与曲面的绘制 一、实验题目:(实验习题1-2) 利用参数方程作图,做出由下列曲面所围成的立体图形: (1) x y x y x z =+--=2 222,1及xOy 平面; (2) 01,=-+=y x xy z 及.0=z 二、实验目的和意义 1、利用数学软件Mathematica 绘制三维图形来观察空间曲线和空间曲面图形的特点,以加强几何的直观性。 2、学会用Mathematica 绘制空间立体图形。 三、程序设计 空间曲面的绘制 作参数方程],[],,[,),(),() ,(max min max min v v v u u v u z z v u y y v u x x ∈∈? ?? ??===所确定的曲面图形的 Mathematica 命令为: ParametricPlot3D[{x[u,v],y[u,v],z[u,v]},{u,umin,umax}, {v,vmin,vmax},选项] (1) (2) 四、程序运行结果 (1) (2) 五、结果的讨论和分析 1、通过参数方程的方法做出的图形,可以比较完整的显示出空间中的曲面和立体图形。 2、可以通过mathematica 软件作出多重积分的积分区域,使积分能够较直观的被观察。 3、从(1)中的实验结果可以看出,所围成的立体图形是球面和圆柱面所围成的立体空间。 4、从(2)中的实验结果可以看出围成的立体图形的上面曲面的方程是xy z =,下底面的方程是z=0,右边的平面是01=-+y x 。 实验一 空间曲线与曲面的绘制 一、实验题目:(实验习题1-3) 观察二次曲面族kxy y x z ++=22的图形。特别注意确定k 的这样一些值,当k 经过这些值时,曲面从一种类型变成了另一种类型。 竭诚为您提供优质文档/双击可除word20XX的实验报告 篇一:word实验报告 实验报告 课程名称计算机应用基础实验项目名称word综合练习班级与班级代码12级新闻1班实验室名称(或课室)ss1-201专业新闻学任课教师刘松学号:12251204102姓名:蔡晓童实验日期:20XX-04-11 广东商学院教务处制 姓名实验报告成绩 评语: 指导教师(签名)年月日 说明:指导教师评分后,实验报告交院(系)办公室保存。 一、实验目的 1、2、 掌握常用的word编辑方法 综合运用word桌面排版功能(字符排版、段落排版、 页面排版、图文混排、艺术字等)进行实际文档的处理。 二、实验设备 1、2、 计算机word20XX软件 三、实验步骤 1、新建一个word文档,输入文章。 2、选择“插入”→“图片”→“艺术字”,选择艺术字样式→在对话框中设置字体、字号。 3、选择“插入”→“图片”→“来自文件”,选择所要插入的图片,在合适的位置插入相应的图片,并对图片的格式进行定义。 4、选中要分栏的段落,选择“格式”→“分栏”命令,显示“分栏”对话框,在预设类型中选择一种类型,单击“确定”按钮。 5、将第一段的“潮”字首字下沉,点击【格式】→【首字下沉】→【下沉】,单击“确定”。 6、选择“编辑”→“查找”,输入要查找的内容,然后选择“你”,再进行字体变换。 7、进行字符格式设置,如改变字型,大小,颜色等。8、进行页眉(学号和姓名)和页脚(页码)格式设置。 四、实验结果 如下页所示 五、实验分析与体会 通过本次实验,我了解了word字符格式、段落格式和 页面格式等排版技术和图文混排等技术的使用,今后可以更好的运用word在生活中工作中制作文档。而且通过这次试验,我觉得自己动手排版非常有趣。因为我对word文档的 操作的不熟悉,所以,我的速度一直很慢,而且,还不可以更具自己想要的效果自由的进行操作,但是在经过一边查书,一边操作的过程中,经过自己的努力,终于完成了我的文档。我越来越熟悉它的操作,并且能够运用其中大部分的工具,来完善自己的文档。而且我也明白了,word文档的操作是很基础的计算机运用,也是使用范围非常广泛的程序。因此,学习这一门课程是非常重要和必要的。 广□播站潮州市高级中学云里之音○ 作为校园文化的传媒机构,以丰富学生的校园生活,传播校园资讯为目的,以"努只为把声音传得更远"为口号,力,陪伴高级 走过了许多风风雨雨。在高级中学团中学 学生会的管理下,委会、广播站一如既往地坚持发扬广播不怕苦,不怕累的精神,努力唱响青春,唱响热情。 mondaysunshineAfternoon:品味生活点滴享受午后阳光;为你带来新鲜的生活资讯,介绍生活小常识。Tuesdaywindow:ListeningListeningwindow, 1.(1) [1 2 3 4;0 2 -1 1;1 -1 2 5;]+(1/2).*([2 1 4 10;0 -1 2 0;0 2 3 -2]) 2. A=[3 0 1;-1 2 1;3 4 2],B=[1 0 2;-1 1 1;2 1 1] X=(B+2*A)/2 3. A=[-4 -2 0 2 4;-3 -1 1 3 5] abs(A)>3 % 4. A=[-2 3 2 4;1 -2 3 2;3 2 3 4;0 4 -2 5] det(A),eig(A),rank(A),inv(A) 求计算机高手用matlab解决。 >> A=[-2,3,2,4;1,-2,3,2;3,2,3,4;0,4,-2,5] 求|A| >> abs(A) ans = ( 2 3 2 4 1 2 3 2 3 2 3 4 0 4 2 5 求r(A) >> rank(A) ans = 4 求A-1 《 >> A-1 ans = -3 2 1 3 0 -3 2 1 2 1 2 3 -1 3 -3 4 求特征值、特征向量 >> [V,D]=eig(A) %返回矩阵A的特征值矩阵D 与特征向量矩阵V , V = - + + - - + - + - + - + D = { + 0 0 0 0 - 0 0 0 0 + 0 0 0 0 - 将A的第2行与第3列联成一行赋给b >> b=[A(2,:),A(:,3)'] b = 《 1 - 2 3 2 2 3 3 -2四年级科学实验总结
完整word版标准实验报告模板.docx
数学实验报告
word20XX的实验报告
数学实验答案-1