登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: socket 为什么不可以使用setsockopt()来设置connect()超时?     [回主站]     [分站链接]
标题
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 说:
就用非阻塞就行了



总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1