一、 实验目的
掌握 Winsock I/O 模型工作原理;熟悉 I/O 模型中使用的 Winsock 接口函数;
掌握使用 I/O 模型进行网络程序设计的编程步骤;
二、实验设计
1、背景知识Windows套接字工作模式
Windows 套接字工作模式分为两类:阻塞(Blocking)模式和非阻塞(NonBlocking)模式。在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回(将控制权交还给程序),这就意味着任一个线程在某一时刻只能执行一个输入/输出(I/O)操作,而且应用程序很难同时通过多个建好连接的套接字进行通信。正如我们在以前的实验中看到的,服务端或客户端在运行到recv()函数时会进入阻塞状态,直到对方响应时(即运行了send()函数后)才能继续执行下去。在默认的情况下,套接字工作在阻塞模式。在非阻塞模式下,Winsock函数会立即返回,并交出程序的控制权,这就为我们实际需要中同时管理多个连接、并维持与每个连接的及时通信提供了基础。在实际问题中,Winsock编程经常需要使用多线程的方法使程序对用户的动作进行及时响应,但会增加一些开销,并且扩展性比较差。尽管非阻塞模式套接字在使用上不如阻塞套接字简单,但它在功能上还是非常强大的,同时简化了我们针对实际问题的编程过程。
WinsockI/O模型
1)选择模型(SelectModel)本次实验使用了事件选择模型,所以下面介绍事件选择模型:
2)异步选择模型(WSAAsyncSelectModel)
3)事件选择模型(WSAEventSelectModel)
4)重叠模型(OverlappedModel)
5)完成端口模型(CompletionPortModel
WSAEventSelect模型是WinSock提供的另一个异步I/O模型,与WSAAsyncSelect模型类似,也允许应用程序在一个或多个套接字上接收以事件为基础的网络事件通知,并且支持的网络事件与WSAAsyncSelect模型一样。与WSAAsyncSelect模型的主要区别在于网络事件会被发送到一个事件对象句柄,而不是发送到一个窗口。WSAEventSelect函数原型如下:intWSAEventSelect(SOCKETs,WSAEVENThEventObject,longlNetworkEvents);
使用WSAEventSelect模型编程的基本步骤:
(1).创建一个事件句柄表和一个对应的套接字句柄表。2、实验设计
(2).每创建一个套接字,就创建一个事件对象,把它们的句柄分别放入上面的两个表中,并调用WSAEventSelect将二者关联起来。
(3).调用WSAWaitForMultipleEvents在所有事件对象上等待(bWaitAll=FALSE),函数返回后,从第一个有信号的事件对象开始检查事件对象表中的事件对象是否有信号(再次调用WSAWaitForMultipleEvents)。
(4).调用WSAEnumNetworkEvents(),获取套接字上相应的网络事件并处理,然后继续在事件对象上等待。
(1)、利用事件选择模型,构建一个 TCP 服务器,该服务器能:
接受客户端连接时显示客户端的 IP,PORT信息;
接收客户端连接时显示其连接编号,客户端退出时显示关闭的连接编号;
能显示客户端发来的数据;
能从键盘输入数据并发到客户端;
其他数据传送功能(可选)。