新Windows网络程序设计(夏靖波) 第3章.pptVIP

新Windows网络程序设计(夏靖波) 第3章.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
图3.1 流套接字编程时序图   具体步骤如下:   (1) 建立套接字。此过程通过socket函数完成。   (2) 要将指定协议的套接字绑定到它已知的名字上,这个名字就是本地的IP地址端口号。此过程通过bind函数完成。   (3) 服务进程要处于监听状态,等待任意数量的客户端连接,以便为它们的请求提供服务。此服务进程必须在所绑定的名字上进行监听,所以要把套接字置为监听模式。此过程通过listen函数来实现。   (4) 服务进程调用函数accept或WSAAccept准备接收来自客户端的连接,如果一个客户端用connect函数试图建立连接,服务进程就可以接受连接。   (5) 建立连接后,服务器和客户端之间就可以使用send和recv函数进行通信。注意默认情况recv函数处于阻塞模式,在接收到数据前,程序不向下执行。   (6) 通信结束后,调用closesocket函数关闭套接字。   2. 数据报套接字编程模型   数据报套接字是无连接的,其编程过程比流套接字简单。数据报套接字编程时序如图3.2所示。 图3.2 数据报套接字编程时序图   具体步骤如下:   (1) 服务器和客户端都建立一个数据报套接字。   (2) 服务器调用bind函数给套接字分配一个公认的端口,在开发应用程序时,这个公认端口通常是指定的。客户端同样需要对套接字进行绑定。   (3) 客户端和服务器都可以使用sendto函数发送数据,使用recvfrom函数接收数据,完成数据报传递。默认情况recvfrom函数处于阻塞模式,在接收到数据前,程序不向下执行。   (4) 通信结束后,调用closesocket函数关闭套接字。 3.3 WinSock I/O模型 3.3.1 Select模型   Select模型是WinSock中最常见的I/O模型。通过调用Select函数可以确定一个或多个套接字的状态,判断套接字上是否存在数据,或者能否向一个套接字写入数据。它既能防止应用程序在套接字处于阻塞模式时,在一次I/O操作后被阻塞,同时也能防止在套接字处于非锁定模式时,产生WSAEWOULDBLOCK错误。Select函数如下: int WSAAPI select( int nfds,     fd_set FAR *readfds,     fd_set FAR *writefds,     fd_set FAR *exceptfds,     const struct timeval FAR *timeout );   其中:   参数nfds指明被检查的套接字描述符的值域,一般被忽略;   参数readfds指向要做读检测的套接字描述符集合的指针,调用者希望从中读取数据;   参数writefds指向要做写检测的套接字描述符集合的指针;   参数exceptfds指向要检测是否出错的套接字描述符集合的指针;   参数timeout指向select()等待的最大时间,如设为NULL,则为阻塞时间。参数timeout为timeval结构数据,timeval结构的格式为: struct timeval { long tv_sec; //秒(s) long tv_usec; //毫秒(ms) }; 其中tv_sec字段以s为单位指定等待时间,tv_usec则以ms为单位指定等待时间。若将超时值设置为(0, 0),则Select会立即返回,允许应用程序对Select进行轮询,出于对性能方面的考虑,应避免这样的设置。   返回值:如果没有错误产生,select()返回包含在fd_set结构中已准备好的套接字描述符的总数目;若调用超过timeval设定的时间,则返回0;若调用失败,则返回SOCKET_ERROR。   WinSock提供了FD_SETSIZE变量用于确定一个集合中最多的套接字描述字数目(FD_SETSIZE缺省值为64,可在包含WinSock.h前用#define FD_SETSIZE来改变该值)。此外,还提供了4个宏对fd_set结构进行操作,分别是: * FD_CLR(s, *set):从集合set中删除描述字s。 * FD_ISSET(s, *set):若s为集合中一员,则非零,否则为零。 * FD_SET(s, *set):向集合添加描述字。 * FD_ZERO(s, *set):将set初始化为空集NULL。 3.3.2 WSAAsyncSelect模型   WSAAsyncSelect模型是WinSock中另一个常用的异步I/O模型。利用这个模型可在一个套接字上接收以Windows消息为基础的网络事件通知。该模型的实现方法是通过调用WSAAsyncSelect函数自动将套接字设置为阻塞模式,并

您可能关注的文档

文档评论(0)

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档