- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
网络编程8-网络编程模型介绍
TCP/IP协议及网络编程技术 常见 Socket I/O 模型 以Windows为例 第二次作业 分别说明数据报和数据流式套接字基本网络编程流程 Winsock I/O 模型 套接字模式 套接字I/O模型 阻塞模型 I/ O 复用——select 消息机制——WSAAsyncSelect 事件机制——WSAEventSelect 重叠I/O模型——Overlapped I/O I/O完成端口——IOCP 各种IO模型比较及Linux下网络编程特点 套接字模式 套接口I/O 模式: 套接口进行输入、输出时调用的那些函数进行操作的工作模式。 Winsock 支持两种I/O模式: 阻塞(BLOCK):I/O操作完成前,执行该操作的Winsock 函数(比如sent/sendto和recv / recvfrom)会一直等待下去直到所需进行的操作完成为止 非阻塞(NONBLOCK)。 Winsock函数无论操作是否己完成,都会立即返回。通常会发现这些函数操作失败,并且会得到WSAEWOULDBLOCK 的错误码。它意味着所进行的函数操作在函数调用的这段时间内没有完成,必须重新进行尝试。 套接字模式 例子:recvfrom() 阻塞模式:recvfrom函数后将一直处于等待状态,直到接收完数据: 非阻塞模式下:recvfrom函数后将会立即返回 可能成功接收完数据 大多数情况下,返回WSAEWOULDBLOCK。 套接字模式 阻塞模式 便于应用; 效率低:所在的线程会阻塞(可能是整个进程阻塞) 非阻塞模式 使用比较麻烦; 效率高。 默认情况 Winsock 函数都以阻塞模式进行工作 主要函数connect、accept 、recv/recvfrom、send/sendto、closesocket等。 套接字模式 修改套接字模式 套接字的默认模式是阻塞模式 ioctlsocket 函数可以改变套接口的I/O 模式。 函数定义: int iocltlsocket ( SOCKET s , long cmd , u _ long FAR *argp ) ; s 是待处理的套接口描述字, cmd 是对该套接口进行的操作(模式修改),可以是FIONBIO 、FIONREAD 或者SIOCATMARK 。FIONBIO 用于开启/禁止套接口的非阻塞I/O 模式。 argp 是cmd 的参数。 举例: u _ lonq bNonblock = 1 ; //阻塞模式ioctlsocket ( sock , FIONBIO , bNonblock ) linux下采用fcntl函数 fcntl(socket_id, F_SETFL, O_NONBLOCK) 套接字模式 非阻塞模式下I/O的操作: 以recv为例 调用了recv函数后马上返回 如果此时缓冲区中并没有待处理的数据,那recv将不能成功。 通常需要多次调用函数,直至成功读取数据。 非阻塞模式下I/O操作的关键: 确定套接字何时可读/可写,也就是判断网络事件何时发生。 不断去测试事件是否发生? 会影响到程序的性能。 windows下套接字I/O模型 阻塞模型 select模型 WSAAsyncSelect模型 WSAEventSelect模型 重叠I/O模型 I/O完成端口模型 阻塞模型 线程直接使用阻塞方式发起 I/O 调用-基本模型 将阻塞在 该 I/O 调用上直至该操作结束,期间无法发起其他 I/O 操作或执行其他逻辑。 例如阻塞方式在套接字上调用 recv() 读取远端发送的数据时,调用线程将一直阻塞直至套接字缓冲区中接收到对端发送的数据时为止。 低并发量时: 使用 “阻塞多线程模型” 构建应用服务器:使用多个线程一 对一地为客户端提供服务,各个线程内使用阻塞 I/O 。 高并发量时: 过多的线程将占用大量内存作为线 程堆栈 线程切换的开销大 和线程共享数据的同步开销降低应用服务器的伸缩性。 如何在阻塞模型中使用线程 线程函数: void Handle(LPVOID param) param创建线程时传进的参数_客户套接字 进程中进行独立的处理工作 创建进程的函数 _beginthread(Handle, 0, (LPVOID)msgsock); 主套接字在accept后调用此函数处理客户通信。 线程还有很多知识 同步,挂起,恢复等... I/ O 复用——select模型 使用select 函数 系统会阻塞在该函数上 超时或者预设定的某个I/O条件(如套接口上有数据可读)得到满足,此时可以进行相应的I/O 操作(如读数据)并能立即得到结果。 select可以防止在在阻塞模式的套接字里被锁死,避免在非阻塞套接字里重复检查WSAEWOULDBLOCK错误 与
文档评论(0)