摘要: 引言基于Socket的网络通信服务已经使用得相当普遍,然而一个服务器应用程序,假如不能够同时为多个客户端提供服务,那它就没有什么意义可言。针对一个服务器应用程序底层通信模块的设计,要使其在给定的时间内同时控制几个套接字,采用重叠的I/O机制是比较好的,但是要求服务器在任何给定时间内都会为海量I/O请求提供服务,Winsock 2.0中引入的内核级完成端口(Input/Output Completion Port,IOCP)是处理大量并发连接的最佳处理方案。相对于其他I/O模型,IOCP针对操作系统内部进行了优化,提供了较好的伸缩性和较高的数据吞吐率,满足服务器的高性能要求。文中针对基于IOCP 阅读全文
posted @ 2011-05-08 23:21 张超01 阅读(304) 评论(0) 推荐(0) 编辑
摘要: 对于网络开发者来说,完成例程应该是一个不陌生的概念(什么?你不知道?去看看书吧)。我在网上看了一下,发现完整实现完成例程的代码很少。前些日子由于工作不是很忙就自己写了一个,今天将如何实现公布出来,希望对大家有个帮助。由于水平有限,代码中难免会有不对的地方,希望各位看客能不吝指出。言归正传。完成例程在其性能上仅次于IOCP。通过我的测试,觉得一般支持1000-2000的客户端应该没有什么问题。而且实... 阅读全文
posted @ 2010-04-11 23:15 张超01 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 有开发网络应用经历的人都知道,网络中的接收和发送数据都是使用WINDOWS中的SOCKET进行实现。但是如果此套接字已经断开,那发送数据和接收数据的时候就一定会有问题。可是如何判断这个套接字是否还可以使用呢?   有人一定想到使用Send函数中的返回结果来进行判断。如果返回的长度和自己发送出去的长度一致,那就说明这个套接字是可用的,否则此套接字一定出现了问题。但是我们并不是无时无刻的发送数据呀。如... 阅读全文
posted @ 2010-04-11 23:15 张超01 阅读(513) 评论(0) 推荐(0) 编辑
摘要: 在我以前写的文章中,一直说的是如何接收数据。但是对于如何发送数据却一点也没有提到。因为从代码量上来说接收的代码要比发送多很多。今天我就来写一下如何使用IOCP发送数据。 function TNetControl.SendSpecifyData(const Socket: TSocket; Data: array of char; DataLen: Integer): Boolean;const D... 阅读全文
posted @ 2010-04-11 23:14 张超01 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 最近太忙,所以没有机会来写IOCP的后续文章。今天好不容易有了时间来写IOCP的粘包处理问题。TCP数据粘包的产生原因在于TCP是一种流协议。在以太网中一个TCP的数据包长度是1500位。其中20位的IP包头,20位的TCP包头,其余的1460都是我们可以发送的数据。在数据发送的时候,我们发送的数据长度有可能比1460短,这样在TCP来说它还是以一个数据包来发送。从而降低了网络的利用率。所以TCP... 阅读全文
posted @ 2010-04-11 23:13 张超01 阅读(321) 评论(0) 推荐(0) 编辑
摘要: 今天我写一下关于DELPHI编写完成端口(IOCP)的工作者线程中的东西。希望各位能提出批评意见。上次我写了关于常见IOCP的代码,对于IOCP来说,接受到客户端发送过来和自己发送出去的数据都是从工作者线程中得到。代码和解释如下:function ServerWorkerThread(CompletionPortID:Pointer):Integer;stdcall;begin Completio... 阅读全文
posted @ 2010-04-11 23:08 张超01 阅读(465) 评论(0) 推荐(0) 编辑
摘要: 用DELPHI开发网络代码已经有一段时间了!我发现在网上用VC来实现完成端口(IOCP)的代码很多,但是使用DELPHI来实现的就比较少了。对IOCP讲的清楚的就更少了。在这里我把自己编写DELPHI下的IOCP写出来,希望对刚学完成端口的朋友有个帮助。首先我们来了解一些在使用IOCP的时候需要使用的一些结构!(1):单IO数据结构 LPVOID = Pointer; LPPER_IO_OPERA... 阅读全文
posted @ 2010-04-11 23:07 张超01 阅读(358) 评论(0) 推荐(0) 编辑