免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 36074 | 回复: 1
打印 上一主题 下一主题

[算法] 短时间内大量connect()会出现Cannot assign requested address错误 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
1 [报告]
发表于 2012-11-10 10:31 |显示全部楼层
如果代理程序在Internet上运行,缩短TIME_WAIT时间可不是个好主意

如果你能控制本地端口号的使用,可以这么创建连接

第一步:创建SOCKET
第二步:分配一个本地端口号和本地地址
第三步:设置SOCKET选项允许REUSED端口
第四步:bind第二步的地址和端口
第五步:connect服务器的地址和端口

我做一个单进程1万并发的FTP服务器的数据连接就是这么做的,PORT方法数据连接是由服务器发起的

为保证端口不被用光,本地IP至少申请10个以上,发起连接的IP地址和端口轮换着用
否则碰上迅雷之类的立马端口耗尽

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2012-11-10 12:32 |显示全部楼层
NalaGinrut 发表于 2012-11-10 11:48
能否解释下这句话?

另外,“分配一个本地端口号和本地地址“是针对最一开始那个socket吗?


1、FTP如果是PORT方法产生数据通道
连接的发起是服务器,接收连接的是客户端
如果是PASV方法,连接发起是客户端,接收连接是服务器

2、临时连接端口复用
随便啦
比如一开始的连接不bind
然后用getsockaddr获得此连接的本地端口和地址
close()之后以后再连接就复用这个地址和端口
其实TCP的connect()首先要做的就是查找空闲的本地地址+端口组合,然后bind,然后connect
平常都是把sockaddr_t给初始化成0,所以不用显式调用bind()
某些地方的防火墙会限制发起连接的IP地址或是不同的IP地址有不同的连接限制
这时候就要自己去管理连接创建时的本地地址和端口

最简单的方法,不用改程序,多设置几个同网段的IP地址就行了,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP