免费注册 查看新帖 |

Chinaunix

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

[socket]为什么不可以使用setsockopt()来设置connect()超时? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-14 18:30 |只看该作者 |倒序浏览
小弟根底浅薄,在这里提个笨问题大家不要见笑


int sock = socket(PF_INET, SOCK_STREAM, 0);
if(sock == -1) {
// err.....
}
if(connect(sock, ....) == -1) {

// err ...
}

一般情况下,要么很快连接成功,要么很快地失败(例如进程不在了导致Connection refused.)

如果目标主机上有人搞了这么一出:

/sbin/iptables -F
/sbin/iptables -I INPUT -i eth0 --syn -j DROP

那么connect()会持续七十多秒,然后才通知程序超时。

去百度google检索了一圈,发现有一种比较流行的解决方法:

先把sock通过fcntl()设置成非阻塞式的然后再connect()然后再判断errno然后再select()最后再fcntl()设置回来。

我就有点糊涂了--直接在setsockopt()上支持一下这个功能不好么?干嘛非要兜这老大一圈?

论坛徽章:
0
2 [报告]
发表于 2009-10-14 22:40 |只看该作者
先把sock通过fcntl()设置成非阻塞式的然后再connect()然后再判断errno然后再select()最后再fcntl()设置回来。


这种做法是否可行呢?非阻塞立即返回,就算对方没有设置防火墙,如果距离比较远的话,延迟比较大,很可能就连接不成功了。

所以还是缩短一下超时时间比较好。

论坛徽章:
0
3 [报告]
发表于 2009-10-15 08:54 |只看该作者
就用非阻塞就行了

论坛徽章:
0
4 [报告]
发表于 2009-10-15 12:09 |只看该作者
原帖由 emmoblin 于 2009-10-14 22:40 发表
先把sock通过fcntl()设置成非阻塞式的然后再connect()然后再判断errno然后再select()最后再fcntl()设置回来。


这种做法是否可行呢?非阻塞立即返回,就算对方没有设置防火墙,如果距离比较远的话,延迟比较 ...


所以connect后要用select()
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP