免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ch_chosen
打印 上一主题 下一主题

[C] 请问connect什么时候会超时? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-09-26 11:29 |只看该作者
等俺回去研究下UNP{:3_190:}

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
12 [报告]
发表于 2012-09-26 11:44 |只看该作者
本帖最后由 zylthinking 于 2012-09-26 11:45 编辑
ch_chosen 发表于 2012-09-26 11:22
因为我发现connect的返回错误码里有个ETIMEOUT,不知道到底什么时候能超时,也不知道怎么设置这个超时时间
...


这个是 TCP 协议实现自己定义的, 当然也不排除将其暴露出来给调用者调整的可能, 如果可以调整, 估计在 setsockopt ioctl 之类的函数估计会有相应的选项
timeout 要出现, 应该之后服务器没有任何回应的时候才会出现, 比如根本该地址上无任何机器, 或者不可达(但不可达中间路由器会返回回馈给客户端, 所以不太可能, 除非路由器断电了)。 再或者服务器配置成不发送任何反馈包给不认识的访问, 这样客户端得不到任何回应就会等待, 最终超时。
如果有任何回馈回来, 客户端就会知道发生了某些情况, 自然不会傻乎乎的继续等, 而会以其他的错误状态或者成功返回

论坛徽章:
0
13 [报告]
发表于 2012-09-26 14:33 |只看该作者
时间长了就超时

论坛徽章:
0
14 [报告]
发表于 2012-09-26 14:55 |只看该作者
没在哪里看到有明确的定义,不过就我所知这个说法是对的,

timeout 要出现, 应该之后服务器没有任何回应的时候才会出现


拦截SYN包,或者connect一个non-routable的IP,都会出现超时。


比如根本该地址上无任何机器, 或者不可达


这里似乎说反了,
无机器的话是unreachable错误,不可达才是Connect timeout。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
15 [报告]
发表于 2012-09-26 15:03 |只看该作者
找不到目标机会由路由器ICMP回应告知EHOSTUNREACH, 找到目标机但没有监听将返回ECONNREFUSED, 剩下就是阻塞N秒后ETIMEDOUT.

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
16 [报告]
发表于 2012-09-26 15:10 |只看该作者
sacry 发表于 2012-09-26 14:55
这里似乎说反了,
无机器的话是unreachable错误,不可达才是Connect timeout


没机器其实也就是不可达的一种, 我想到哪里说到哪里

论坛徽章:
0
17 [报告]
发表于 2012-09-26 15:37 |只看该作者
回复 15# linux_c_py_php


non-routable也会导致ETIMEDOUT

PS: 你说的不accept, 是connect timeout?
我觉得这种情况客户端完成了3次握手,connect已经成功。和accept没有关系。

论坛徽章:
0
18 [报告]
发表于 2012-09-26 16:02 |只看该作者
我试了下
1.connect一个不可达的IP地址会一直阻塞直到ETIMEOUT,这个时间不是30秒和75秒,而是3分钟以上
2.connect一个有效地址,但这个地址没有进行listen,直接返回ECONNREFUSED
3.setsockopt(SO_SENDTIMO, 5秒),然后connect,阻塞5秒返回EINPROGRESS,这个不清楚为什么,我并没有设置非阻塞模式啊

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
19 [报告]
发表于 2012-09-26 16:10 |只看该作者
ch_chosen 发表于 2012-09-26 16:02
我试了下
1.connect一个不可达的IP地址会一直阻塞直到ETIMEOUT,这个时间不是30秒和75秒,而是3分钟以上
...


第一条测试结果不靠普, 这个要看网络运营商如何设置及中间各个设备是否严格遵循了协议, 而不单单是 TCP 协议如何规定的了

第三个很容易解释, 5秒后是你要求返回的, 协议本身还没有超时, 所以 IN progress

论坛徽章:
0
20 [报告]
发表于 2012-09-26 16:31 |只看该作者
关于第三条,这么说我设置了发送超时时间也就是把socket设成了非阻塞?因为EINPROGRESS的解释就是socket是非阻塞的
还有一般程序怎样控制connect的超时时间的?回复 19# zylthinking


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP