Windows网络编程 实验五 IO模型实验报告

更新时间:2023-06-30 09:17:43 阅读: 评论:0

网络程序设计
实验报告
   
实验名称:_______ IO模型实验__________
实验类型:_______验证型实验__        ____
指导教师:____                      ___
专业班级:_____          _______________
    名:_____ _      _______________
    号:_______        ____________
电子邮件:___                    ______
实验地点:_____          _____________
期:                    
实验成绩:__________________________
设计专业考研
mba分数线一、实验目的
掌握Winsock I/O模型工作原理;
熟悉I/O模型中使用的Winsock接口函数;
掌握使用I/O模型进行网络程序设计的编程步骤;
二、实验设计
cooky
1.背景知识
Windows套接字工作模式イモウトノカタチ
Windows套接字工作模式分为两类:阻塞(Blocking)模式和非阻塞(NonBlocking)模式。
在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回(将控制权交还给程序),这就意味着任一个线程在某一时刻只能执行一个输入/输出(I/O)操作,而且应用程序很难同时通过多个建好连接的套接字进行通信。正如我们在以前的实验中看到的,服务端或客户端在运行到recv()函数时会进入阻塞状态,直到对方响应时(即运行了nd()函数后)才能继续执行下去。在默认的情况下,套接字工作在阻塞模式。
在非阻塞模式下,Winsock函数会立即返回,并交出程序的控制权,这就为我们实际需要中同时管理多个连接、并维持与每个连接的及时通信提供了基础。在实际问题中,Winsock编程经常需要使用多线程的方法使程序对用户的动作进行及时响应,但会增加一些开销,并且扩展性比较差。尽管非阻塞模式套接字在使用上不如阻塞套接字简单,但它在功能上还是非常强大的,同时简化了我们针对实际问题的编程过程。paralogue
Winsock I/O模型
1)garnet选择模型(Select Model)
2)异步选择模型(WSAAsyncSelect Model)
3)事件选择模型(WSAEventSelect Model)
4)重叠模型(Overlapped Model)
5)完成端口模型(Completion Port Model)
选择模型
Select模型是WinSock中最常见的I/O模型,通过调用Select函数可以确定一个或多个套接字的状态,判断套接字上是否存在数据,或者能否向一个套接字写入数据。该模型关键在于lect函数,其函数原型如下:
int  lect(
            int    nfds//忽略
          fd_t  *readfds//检查可读性集合
            fd_t  *writefds//检查可写性集合
            fd_t  *exceptfds//检查错误集合
const struct timeval  *timeout//等待时间);
函数返回时指定的集合中保留了发生网络事件的套接字,应用程序可以对此进行判断从而确定在哪些套接字上有网络事件发生,进而进行数据或者错误处理。
使用该模型的编程一般步骤如下:
1.建立fd_t集合s,用来存放欲使用的套接字。
2.将套接字添加到集合s中。
3.确定要检查的套接字集合Xi1=< i< =3)。
4.使用FD_ZERO,初始化Xi
5.使用FD_SETbreakeven,根据需要将套接字句柄添加到Xi
6.调用lect最终幻想13主题曲函数
7.根据lect函数的返回值进行处理,当成功返回时,判断s中套接字是否在Xi        中,并进行相应处理(处理时可能要添加新的套接字到s中)
8.回到4
异步选择模型
WSAAsyncSelect模型是WinSock中另一个常用的异步I/O模型,该模型可在套接字上接收以Windows消息为基础的网络事件通知,通过调用WSAAsyncSelect函数自动将套接字设置为非阻塞模式,并向WinSock DLL注册一个或多个感兴趣的网络事件,同时提供接收通知时使用的窗口句柄,当注册的网络事件发生时,对应的窗口将收到一个基于消息的通知。
WSAAsyncSelect函数原型如下:
int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int uMsg, long lEvent);
其中s就是我们想要的那个套接字;hWnd是接收消息通知那个窗口句柄;wMsg参数指定
在发生网络事件时要接受的消息,通常设成比WM_USER大的一个值,以避免消息冲突;lEvent指定了一个位掩码,对应一系列网络事件的组合,见表3-1所示。
事件含义对照表
lEvent
含义
FD_READ
程序想要接收有关是否可读的通知,以便读入数据
FD_WRITE
程序想要接收有关是否可写的通知,以便写入数据
FD_OOB
程序想要接收是否有OOB数据到达的通知
FD_ACCEPT
程序想要接收与进入连接有关的通知
FD_CONNECT
程序想要接收与一次连接或多点接入有关的通知
FD_CLOSE
程序想要接收与套接字关闭有关的通知
FD_QOS
程序想要接收套接字"服务质量(QoS)"发生变化的通知
FD_GROUP_QOS
暂时没用,属于保留事件
FD_ROUTING_INTERFACE_CHANGE
程序想要接收有关到指定地址的路由接口发生变化的通知
FD_ADDRESS_LIST_CHANGE
程序想要接收本地地址变化的通知
当程序在一个套接字上调用WSAAsyncSelect成功后,这个程序就会在与hWnd窗口句柄对应的窗口例程中以Windows消息的形式接收网络事件通知。窗口例程通常定义成这个样子:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
其中wParam参数指定在其上面发生了一个网络事件的套接字,如果定义了多个套接字,这个参数就显得很重要了。yourgracelParam参数则包含了两方面的重要信息,它的低位字指定了已经发生的网络事件,而高位字包含了可能出现的错误代码。
简单的来说,这个模型的具体使用流程就是:当网络消息抵达一个窗口例程后,程序要先检测lParam的高位字节,从而判断是否在套接字上面发生了网络错误。现成的宏已经有在这里了 --> WSAGETSELECTERROR,可以用它返回高字节包含的错误信息,如果没有发现任何的错误,接下来就是确定究竟是什么类型的网络事件触发了这条Windows消息,这个操作也有现成的宏 --> WSAGETSELECTEVENT。
使用WSAAsyncSelect模型编程步骤:
1.winsock初始化
2.自定义WM_SOCKET 消息
3.创建窗口
4.创建套接字
5.调用WSAAsyncSelect()
6.编写WindowProc()
事件选择模型
WSAEventSelect模型是WinSock提供的另一个异步I/O模型,与WSAAsyncSelect模型类似,也允许应用程序在一个或多个套接字上接收以事件为基础的网络事件通知,并且支持的网络事件与WSAAsyncSelect模型一样。与WSAAsyncSelect模型的主要区别在于网络事件会被发送到一个事件对象句柄,而不是发送到一个窗口。
WSAEventSelect函数原型如下:
翻译网站
int WSAEventSelect( SOCKET s, WSAEVENT hEventObject,long lNetworkEvents );
使用WSAEventSelect模型编程的基本步骤:
1.创建一个事件句柄表和一个对应的套接字句柄表。
2.每创建一个套接字,就创建一个事件对象,把它们的句柄分别放入上面的两个表中,并调用WSAEventSelect将二者关联起来。
3.调用WSAWaitForMultipleEvents在所有事件对象上等待(bWaitAll = FALSE),函数返回后,从第一个有信号的事件对象开始检查事件对象表中的事件对象是否有信号(再次调用WSAWaitForMultipleEvents )。
4.调用WSAEnumNetworkEvents(),获取套接字上相应的网络事件并处理,然后继续在事件对象上等待。
重叠模型
重叠模型是让应用程序使用重叠数据结构(WSAOVERLAPPED),一次投递一个或多个Win
sock I/O操作,在这些提交的I/O操作完成之后,应用程序可以接收到完成通知,从而进行相应的处理。有两种方法可以接收到重叠IO操作的完成的通知:
1. 在事件对象上等待通知(event object notification)
2. 完成例程(completion routines) ,注意:并不是完成端口
一般采用第一种方法,采用在投递重叠操作时使用的重叠结构上的事件对象等待以获得完成通知,当该事件对象受信时,再调用WSAGetOverlappedResult函数获得完成状态。该函数原型如下:
    BOOL WSAGetOverlappedResult(
    SOCKET s,
    LPWSAOVERLAPPED lpOverlapped, /* 欲查询结果的重叠结构指针*/
    LPDWORD lpcbTransfer, /* 本次重叠操作的实际接收(或发送)的字节数*/
BOOL fWait,/* 设置为TRUE,除非重叠操作完成,否则函数不会返回,设置FALSE,而且操作仍处于挂起状态,函数会返回FALSE, 错误为WSA_IO_INCOMPLETE*/
    LPDWORD lpdwFlags // 取得完成标志
            );
使用重叠模型的步骤:(以接收操作为例)
1、定义相关变量…………
2、创建监听套接字(使用socket()或WSASocket()),并进入监听状态。
3、接受连接请求(使用accept()或AcceptEx())。
4、为新的连接套接字创建WSAOVERLAPPED结构,并分配事件对象句柄。
5、以WSAOVERLAPPED结构为参数,在套接字上投递WSARecv()请求。

本文发布于:2023-06-30 09:17:43,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/162435.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:事件   接字   网络   模型
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图