- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)