就是服务端太忙,客户端被拒绝10061。等服务端处理完一个请求再Recv时,那边客户端已经断掉了,所以报10054。
这个gh0st的IOCP最大的问题在于void CIOCPServer::OnAccept()中用的是accept(),要真正发挥IOCP的作用应该用AcceptEx()。
OnAccept()在线程ListenThreadProc里,一次处理一个连接请求,返回一个Socket,再Recv、处理数据、Send结果。
用AcceptEx()的话,可以预先post多个accept等待客户端的连接,以及时响应客户端的连接请求。
另外,WorkerThread线程ThreadPoolFunc不应进行有大量计算、数据处理耗时的工作,应放到另外的线程去处理,处理完成后再把结果post到Send队列。ThreadPoolFunc只负责IOCP相关的事情。
建议看看《Network Programming for Microsoft Windows, Second Edition》里第6章的那个IOCP例子。
服务端
[FONT="Courier"]C:\Temp\MyProjects\NPMW\chapter06>iocpserver.exe
Buffer size = 4096 (page size = 4096)
Worker threads: 4
T1516 (Main)
T2152 (Worker)
T2200 (Worker)
T2196 (Worker)
T3984 (Worker)
Local address: 127.0.0.1; Port: 8833; Family: 0
Listening address: [127.0.0.1]:8833
Listen Socket: S1928
Accept #1 [S1928:S1912]
Accept #2 [S1928:S1908]
Accept #3 [S1928:S1904]
Accept #4 [S1928:S1900]
Accept #5 [S1928:S1896][/FONT]
4个工作线程,预先post了5个accepts。listen一旦侦听到注册的FD_ACCEPT事件后,再post 100个accepts。
客户端连接测试
[FONT="Courier"]C:\Temp\MyProjects\ApacheBench>ab.exe -n 1000 -c 500 -s 10 -H "Connection: Close" 127.0.0.1:8833/ServPath/AppServlet?req=2abf0f0ef3d3de84
This is ApacheBench, Version 2.3 <$Revision: 1638069 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: Apache-Coyote/1.1
Server Hostname: 127.0.0.1
Server Port: 8833
Document Path: /ServPath/AppServlet?req=2abf0f0ef3d3de84
Document Length: 42 bytes
Concurrency Level: 500
Time taken for tests: 0.328 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 203000 bytes
HTML transferred: 42000 bytes
Requests per second: 3047.62 [#/sec] (mean)
Time per request: 164.063 [ms] (mean)
Time per request: 0.328 [ms] (mean, across all concurrent requests)
Transfer rate: 604.17 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 1.2 0 16
Processing: 47 130 34.8 141 172
Waiting: 31 82 31.1 94 141
Total: 47 130 34.8 141 172
Percentage of the requests served within a certain time (ms)
50% 141
66% 156
75% 156
80% 156
90% 172
95% 172
98% 172
99% 172
100% 172 (longest request)[/FONT]
这里连接1000个,并发500个,用时0.328秒,全部成功完成。平均每秒处理3047个请求。
当然,作为例子,服务端并没有进行数据处理,接到请求后,简单的返回Http Header和42字节固定长度的数据。