标题
socket 为什么不可以使用setsockopt()来设置connect()超时?
clq
浏览(0) +
2010-04-21 16:47:27 发表
编辑
关键字:
socket 为什么不可以使用setsockopt()来设置connect()超时?[zt]
2010-02-26 Posted in Linux编程问题
weichongli 说:
小弟根底浅薄,在这里提个笨问题大家不要见笑
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()上支持一下这个功能不好么?干嘛非要兜这老大一圈?
------------------------
emmoblin 说:
先把sock通过fcntl()设置成非阻塞式的然后再connect()然后再判断errno然后再select()最后再fcntl()设置回来。
这种做法是否可行呢?非阻塞立即返回,就算对方没有设置防火墙,如果距离比较远的话,延迟比较大,很可能就连接不成功了。
所以还是缩短一下超时时间比较好。@sky 说:
就用非阻塞就行了
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.