很幽默的讲解六种Sket IO模型.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
本文简单介绍了当前Windows支持的各种Socket?I/O模型,如果你发现其中存在什么错误请务必赐教。 一:select模型? ?二:WSAAsyncSelect模型? ?三:WSAEventSelect模型? ?四:Overlapped?I/O?事件通知模型? ?五:Overlapped?I/O?完成例程模型? ?六:IOCP模型 老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系。他们的信会被邮递员投递到他们的信箱里。? ?这和Socket模型非常类似。下面我就以老陈接收信件为例讲解Socket?I/O模型~~~ 一:select模型 老陈非常想看到女儿的信。以至于他每隔10分钟就下楼检查信箱,看是否有女儿的信~~~~~? ?在这种情况下,"下楼检查信箱"然后回到楼上耽误了老陈太多的时间,以至于老陈无法做其他工作。? ?select模型和老陈的这种情况非常相似:周而复始地去检查......如果有数据......接收/发送....... 使用线程来select应该是通用的做法:? ?procedure?TListenThread.Execute;? ?var? ?addr?:?TSockAddrIn;? ?fd_read?:?TFDSet;? ?timeout?:?TTimeVal;? ?ASock,? ?MainSock?:?TSocket;? ?len,?i?:?Integer;? ?begin? ?MainSock?:=?socket(?AF_INET,?SOCK_STREAM,?IPPROTO_TCP?);? ?addr.sin_family?:=?AF_INET;? ?addr.sin_port?:=?htons(5678);? ?addr.sin_addr.S_addr?:=?htonl(INADDR_ANY);? ?bind(?MainSock,?@addr,?sizeof(addr)?);? ?listen(?MainSock,?5?); while?(not?Terminated)?do? ?begin? ?FD_ZERO(?fd_read?);? ?FD_SET(?MainSock,?fd_read?);? ?timeout.tv_sec?:=?0;? ?timeout.tv_usec?:=?500;? ?if?select(?0,?@fd_read,?nil,?nil,?@timeout?)?>?0?then?//至少有1个等待Accept的connection? ?begin? ?if?FD_ISSET(?MainSock,?fd_read?)?then? ?begin? ?for?i:=0?to?fd_read.fd_count-1?do?//注意,fd_count?<=?64,也就是说select只能同时管理最多64个连接? ?begin? ?len?:=?sizeof(addr);? ?ASock?:=?accept(?MainSock,?addr,?len?);? ?if?ASock?<>?INVALID_SOCKET?then? ?....//为ASock创建一个新的线程,在新的线程中再不停地select? ?end;? ?end;? ?end;? ?end;?//while?(not?self.Terminated) shutdown(?MainSock,?SD_BOTH?);? ?closesocket(?MainSock?);? ?end; 二:WSAAsyncSelect模型 后来,老陈使用了微软公司的新式信箱。这种信箱非常先进,一旦信箱里有新的信件,盖茨就会给老陈打电话:喂,大爷,你有新的信件了!从此,老陈再也不必频繁上下楼检查信箱了,牙也不疼了,你瞅准了,蓝天......不是,微软~~~~~~~~? ?微软提供的WSAAsyncSelect模型就是这个意思。 WSAAsyncSelect模型是Windows下最简单易用的一种Socket?I/O模型。使用这种模型时,Windows会把网络事件以消息的形势通知应用程序。? ?首先定义一个消息标示常量:? ?const?WM_SOCKET?=?WM_USER?+?55;? ?再在主Form的private域添加一个处理此消息的函数声明:? ?private? ?procedure?WMSocket(var?Msg:?TMessage);?message?WM_SOCKET;? ?然后就可以使用WSAAsyncSelect了:? ?var? ?addr?:?TSockAddr;? ?sock?:?TSocket; sock?:=?socket(?AF_INET,?SOCK_STREAM,?IPPROTO_TCP?);?

文档评论(0)

asd3366 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档