亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 6758 | 回復(fù): 3
打印 上一主題 下一主題

[socket]為什么不可以使用setsockopt()來設(shè)置connect()超時? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-10-14 18:30 |只看該作者 |倒序瀏覽
小弟根底淺薄,在這里提個笨問題大家不要見笑


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

// err ...
}

一般情況下,要么很快連接成功,要么很快地失敗(例如進(jìn)程不在了導(dǎo)致Connection refused.)

如果目標(biāo)主機(jī)上有人搞了這么一出:

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

那么connect()會持續(xù)七十多秒,然后才通知程序超時。

去百度google檢索了一圈,發(fā)現(xiàn)有一種比較流行的解決方法:

先把sock通過fcntl()設(shè)置成非阻塞式的然后再connect()然后再判斷errno然后再select()最后再fcntl()設(shè)置回來。

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

論壇徽章:
0
2 [報告]
發(fā)表于 2009-10-14 22:40 |只看該作者
先把sock通過fcntl()設(shè)置成非阻塞式的然后再connect()然后再判斷errno然后再select()最后再fcntl()設(shè)置回來。


這種做法是否可行呢?非阻塞立即返回,就算對方?jīng)]有設(shè)置防火墻,如果距離比較遠(yuǎn)的話,延遲比較大,很可能就連接不成功了。

所以還是縮短一下超時時間比較好。

論壇徽章:
0
3 [報告]
發(fā)表于 2009-10-15 08:54 |只看該作者
就用非阻塞就行了

論壇徽章:
0
4 [報告]
發(fā)表于 2009-10-15 12:09 |只看該作者
原帖由 emmoblin 于 2009-10-14 22:40 發(fā)表
先把sock通過fcntl()設(shè)置成非阻塞式的然后再connect()然后再判斷errno然后再select()最后再fcntl()設(shè)置回來。


這種做法是否可行呢?非阻塞立即返回,就算對方?jīng)]有設(shè)置防火墻,如果距離比較遠(yuǎn)的話,延遲比較 ...


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

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP