首页
社区
课程
招聘
[求助]socket 客户端connect 失败,错误10061
发表于: 2016-11-29 22:05 14429

[求助]socket 客户端connect 失败,错误10061

2016-11-29 22:05
14429
500个客户端同时connet服务端,前面大概150客户端能connet上服务端,但是服务端端accept后的新的套接口WSARecv错误,错误10054,后面后面350个客户端connet失败错误10061。另外服务端采用完成端口线程池处理客户端的请求。请问是不是服务端tcp队列被塞满了,导致拒绝服务?如果是该怎么处理服务端代码?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 4668
活跃值: (1713)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不是  你的iocp设计有缺陷
accept是单独线程  只管接收   线程池负责处理
2016-11-29 22:21
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
我用的是gh0st的iocp内核。附件是gh0st的iocp源码,你看看哪里有缺陷
上传的附件:
2016-11-29 22:30
0
雪    币: 145
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
socket库  为什么不用HPSocket?
2016-11-29 22:45
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
原作者这么写的,我也没改,帮我看看为什么500个客户端并发链接会连接不上,客户端错误10061
2016-11-29 22:48
0
雪    币: 145
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
其实..不管是自己使用, 还是学习 , 都可以去看看HPSocket.

开源的,  同样是基于IOCP.
2016-11-29 22:53
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
好的有空去看看,你看看这个gh0st的IOCP什么原因
2016-11-29 22:57
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
8
顶起来顶起来顶起来
2016-11-30 22:29
0
雪    币: 4668
活跃值: (1713)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
要求和客户端是长连接 还是 短连接
2016-11-30 23:00
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
10
长时间连接
2016-12-1 09:34
0
雪    币: 627
活跃值: (663)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
11
就是服务端太忙,客户端被拒绝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字节固定长度的数据。
2016-12-1 12:00
0
游客
登录 | 注册 方可回帖
返回
//