网络通信编程技术3.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《网络通信编程技术3.ppt》由会员分享,可在线阅读,更多相关《网络通信编程技术3.ppt(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第3 章 Windows 套接字I/O 模型 阻塞(blocking)模型选择(select)模型WSAAsyncSelect 模型WSAEventSelect 模型重叠(overlapped)模型完成端口(completion port)模型3.1.1 阻塞模式套接字创建时,默认工作在阻塞模式下。例如,对recv 函数的调用会使程序进入等待状态,直到接收到数据才返回。第2 章的示例程序都是这种情况。大多数Winsock 程序设计者都是从阻塞套接字模式开始学习的,因为这是最容易和最直接的方式。处理阻塞模式套接字的应用程序使用的程序框架便是阻塞模型。此模型是非常容易理解的。阻塞套接字的好处是使用
2、简单,但是当需要处理多个套接字连接时,就必须创建多个线程,即典型的一个连接使用一个线程的问题,这给编程带来了许多不便。所以实际开发中使用最多的还是下面要讲述的非阻塞模式。3.1.2 非阻塞模式非阻塞套接字使用起来比较复杂,但是却有许多优点。应用程序可以调用ioctlsocket 函数显式地让套接字工作在非阻塞模式下,如下代码所示。u_long ul=1;SOCKET s=socket(AF_INET,SOCK_STREAM,0);ioctlsocket(s,FIONBIO,(u_long*)&ul);一旦套接字被置于非阻塞模式,处理发送和接收数据或者管理连接的Winsock 调用将会立即返回。
3、大多少情况下,调用失败的出错代码是WSAEWOULDBLOCK,这意味着请求的操作在调用期间没有完成。例如,如果系统输入缓冲区中没有待处理的数据,那么对recv 的调用将返回WSAEWOULDBLOCK。通常,要对相同函数调用多次,直到它返回成功为止。非阻塞调用经常以WSAEWOULDBLOCK 出错代码失败,所以将套接字设置为非阻塞之后,关键的问题在于如何确定套接字什么时候可读/可写,也就是说确定网络事件何时发生。如果需要自己不断调用函数去测试的话,程序的性能势必会受到影响,解决的办法就是使用Windows 提供的不同的I/O 模型,3.2 选择(select)模型select 模型是一个广
4、泛在Winsock 中使用的I/O 模型。称它为select 模型,是因为它主要是使用select 函数来管理I/O 的。这个模式的设计源于UNIX 系统,目的是允许那些想要避免在套接字调用上阻塞的应用程序有能力管理多个套接字。3.2.1 select 函数select 函数可以确定一个或者多个套接字的状态。如果套接字上没有网络事件发生,便进入等待状态,以便执行同步I/O。函数定义如下。int select(int nfds,/忽略,仅是为了与Berkeley 套接字兼容fd_set*readfds,/指向一个套接字集合,用来检查其可读性 fd_set*writefds,/指向一个套接字集合,
5、用来检查其可写性 fd_set*exceptfds,/指向一个套接字集合,用来检查错误const struct timeval*timeout/指定此函数等待的最长时间,如果为NULL,则最长时间为无限大);函数调用成功,返回发生网络事件的所有套接字数量的总和。如果超过了时间限制,返回0,失败则返回SOCKET_ERROR。1套接字集合fd_set 结构可以把多个套接字连在一起,形成一个套接字集合。select 函数可以测试这个集合中哪些套接字有事件发生。下面是这个结构在WINSOCK2.h 中的定义。3.2.1 select 函数1套接字集合fd_set 结构可以把多个套接字连在一起,形成一
6、个套接字集合。select 函数可以测试这个集合中哪些套接字有事件发生。下面是这个结构在WINSOCK2.h 中的定义。typedef struct fd_set u_int fd_count;/下面数组的大小 SOCKET fd_arrayFD_SETSIZE;/套接字句柄数组 fd_set;下面是WINSOCK 定义的4 个操作fd_set 套接字集合的宏。3.2.1 select 函数FD_ZERO(*set)初始化set 为空集合。集合在使用前应该总是清空z FD_CLR(s,*set)从set 移除套接字s z FD_ISSET(s,*set)检查s 是不是set 的成员,如果是返回
7、TRUE z FD_SET(s,*set)添加套接字到集合3.2.1 select 函数网络事件传递给select 函数的3 个fd_set 结构中,一个是为了检查可读性(readfds),一个是为了检查可写性(writefds),另一个是为了检查错误(exceptfds)。select 函数返回之后,如果有下列事件发生,其对应的套接字就会被标识。3.2.1 select 函数下面的例子示例了select 函数的用法。程序运行之后,在4567 端口监听,接受客户端连接请求,打印出接收到的数据。大家可以看到采用select 模型之后,即便是在单个线程中,也可以管理多个套接字。具体编程流程如下:(
8、1)初始化套接字集合fdSocket,向这个集合添加监听套接字句柄。(2)将fdSocket 集合的拷贝fdRead 传递给select 函数,当有事件发生时,select 函数移除fdRead 集合中没有未决I/O 操作的套接字句柄,然后返回。(3)比较原来fdSocket 集合与select 处理过的fdRead 集合,确定哪些套接字有未决I/O,并进一步处理这些I/O。(4)回到第2 步继续进行选择处理。3.2.1 select 函数实际例程3.3 WSAAsyncSelect 模型WSAAsyncSelect 模型允许应用程序以Windows 消息的形式接收网络事件通知。这个模型是为了
9、适应Windows 的消息驱动环境而设置的,现在许多对性能要求不高的网络应用程序都采用WSAAsyncSelect 模型,MFC(Microsoft Foundation Class,Microsoft 基础类库)中的CSocket 类也使用了它。3.3 WSAAsyncSelect 模型3.3.1 消息通知和WSAAsyncSelect 函数WSAAsyncSelect 函数自动把套接字设为非阻塞模式,并且为套接字绑定一个窗口句柄,当有网络事件发生时,便向这个窗口发送消息。函数用法如下。int WSAAsyncSelect(SOCKET s,/需要设置的套接字句柄 HWND hWnd,/指定
10、一个窗口句柄,/套接字的通知消息将被发送到与其对应的窗口过程中 u_int wMsg,/网络事件到来时接收到的消息ID,/可以在WM_USER 以上的数值中任意选择一个用做ID。long lEvent/指定哪些通知码需要发送 );3.3 WSAAsyncSelect 模型最后一个参数lEvent 指定了要发送的通知码,可以是如下取值的组合:z FD_READ 套接字接收到对方发送过来的数据包,表明这时可以去读套接字了z FD_WRITE 数据缓冲区满后再次变空时,WinSock 接口通过该通知码通知应用程序。表示可以继续发送数据了(短时间内发送数据过多,便会造成数据缓冲区变满)z FD_ACC
11、EPT 监听中的套接字检测到有连接进入z FD_CONNECT 如果用套接字去连接对方的主机,当连接动作完成以后会接收到这个通知码z FD_CLOSE 检测到套接字对应的连接被关闭例如,在监听套接字上可以这样调用WSAAsyncSelect 函数::WSAAsyncSelect(sListen,hWnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE);/WM_SOCKET 为自定义消息上述代码将套接字sListen 设为窗口通知消息类型。WM_SOCKET 为自定义网络通知消息,FD_CLOSE|FD_ACCEPT 指定了sListen 套接字只接收FD_CLOSE 和FD_ACC
12、EPT 通知消息。当有客户连接或套接字关闭时,Winsock 接口将向指定的窗口发送WM_SOCKET 消息。3.3 WSAAsyncSelect 模型最后一个参数lEvent 指定了要发送的通知码,可以是如下取值的组合:z FD_READ 套接字接收到对方发送过来的数据包,表明这时可以去读套接字了z FD_WRITE 数据缓冲区满后再次变空时,WinSock 接口通过该通知码通知应用程序。表示可以继续发送数据了(短时间内发送数据过多,便会造成数据缓冲区变满)z FD_ACCEPT 监听中的套接字检测到有连接进入z FD_CONNECT 如果用套接字去连接对方的主机,当连接动作完成以后会接收到
13、这个通知码z FD_CLOSE 检测到套接字对应的连接被关闭例如,在监听套接字上可以这样调用WSAAsyncSelect 函数::WSAAsyncSelect(sListen,hWnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE);/WM_SOCKET 为自定义消息上述代码将套接字sListen 设为窗口通知消息类型。WM_SOCKET 为自定义网络通知消息,FD_CLOSE|FD_ACCEPT 指定了sListen 套接字只接收FD_CLOSE 和FD_ACCEPT 通知消息。当有客户连接或套接字关闭时,Winsock 接口将向指定的窗口发送WM_SOCKET 消息。3.3 W
14、SAAsyncSelect 模型成功调用WSAAsyncSelect 之后,应用程序便开始以Windows 消息的形式在窗口函数接收网络事件通知。下面是窗口函数的定义。LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);wParam 参数指定了发生网络事件的套接字句柄,lParam 参数的低字位指定了发生的网络事件,高字位包含了任何可能出现的错误代码,可以使用宏WSAGETSELECTERROR 和WSAGETSELECTEVENT 将这些信息取出,这两个宏定义在Winsock2.h 文件中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 通信 编程 技术
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内