- 論壇徽章:
- 0
|
小弟根底淺薄,在這里提個笨問題大家不要見笑
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()上支持一下這個功能不好么?干嘛非要兜這老大一圈? |
|