根据网络上的“修改了的IOCP例子”写的IOCP的DELPHI例子。 ( 积分: 5 )

  • 主题发起人 主题发起人 mill666
  • 开始时间 开始时间
M

mill666

Unregistered / Unconfirmed
GUEST, unregistred user!
网络上有一个“修改了的IOCP例子”,不够是VC版本的;
使用acceptEx;
根据这个例子,我写了一个DELPHI版本的,只有服务端,一个echo服务器;
客户端大家可以自己选择一个,只要能发送报文很接收报文就可以了;

希望大家进行针贬,并发现有哪些bug。

下载:http://upload.programfan.com/upfile/200705301140613.rar
 
ServerWorkerThread()
...
while (WaitForSingleObject( m_h_shutdown_event, 100 ))

这个很没必要

GetQueuedCompletionStatus返回False时,要检查PHandleData是否有值,有则Free

还有最重要一点:内存分配,即:WSASend/WSARecv的ptrBuffer的内存,不要使用GetMem,尽可能的使用VirtualAlloc, GlobalAlloc, HeapAlloc的函数。因为D自带的的GetMem有可能使用VirtualAlloc分配出来的一块内存的一小部分,这样容易出现WSASend/WSARecv返回10055(好像是这个)的错误。
 
今天做了一下压力测试,客户端开了60个连接,每个连接发送6000次数据;
当客户端还在发数据或者接收数据的时候【总之就是客户端还在忙活的时候】,我把服务器停止,这个时候GetQueuedCompletionStatus返回了False,通过getlasterror得到错误码是6,为ERROR_INVALID_HANDLE,请问这是为什么??

而且因为我在GetQueuedCompletionStatus返回FALSE的时候,是continue【就是说继续下一次的循环】,所以结果导致一直在循环执行GetQueuedCompletionStatus,一样返回6的错误;

问题一:难道GetQueuedCompletionStatus返回FALSE的时候并没有删除完成端口的队列queue里面的相应项?如果是这样,才会导致一直GetQueuedCompletionStatus执行个没完没了。


问题二:难道是GetQueuedCompletionStatus返回的PHandleKey为无效的句柄?

请问GetQueuedCompletionStatus在那些情况下会返回FALSE?应分别怎么处理??


压力测试工具大家可以到
http://www.codeproject.com/internet/SimpleIOCPApp/IOCPExecutables.zip
下载,里面有个client的,开个60个连接,每个连接60000次;

当客户端还忙的时候,
在我的服务端按动“服务停止”按钮,这个时候就在memo2里面一直出现GetQueuedCompletionStatus返回FALSE,错误码为6的错误,而且一直循环。
 
TO copy_paste:

如果我在serverworkerthread里面不用while (WaitForSingleObject( m_h_shutdown_event, 100 )),而用while(TRUE),在做压力测试的时候【比如用上面说的压力测试客户端,60个连接,每个连接发60000次数据】,这样就导致程序占用CPU 100%;
要么就是在while循环体的最后加个sleep(2),就不会了;

当然,如果不是做压力测试,而只是发发报文,接接报文,就不会了;
可是做压力测试的时候,用我程序里面的while,或者用sleep,也不会导致CPU 100%的;

原来我也写过一些线程里面有这种 while(true)的循环,如果没有sleep处理,占用CPU也是会100%,加了sleep后就不会;

难道只是delphi的缺陷??

我看“修改了的IOCP例子”里面直接就是写while(TRUE)的,可是它就不会CPU %的。
 
后退
顶部