LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 736|回复: 12

超时重连的代码应该怎么写?

[复制链接]
发表于 2004-5-4 21:00:58 | 显示全部楼层 |阅读模式
我使用下面的方法判断出连接超时:
1)setsockopt();//将socket置为非阻塞模式;
2)connect();
3)判断connect()的返回值,一般情况会返回-1,这时你还必须判断错误码如果是EINPROGRESS,那说明connect还在继续;如果错误码不是前者那么就是有问题了,不必往下执行,必须关掉socket;待下次重联;
4)select();设置好函数中的超时时间,将select()中的read和write项置上,在超时时间内,如果select返回1,即描述字变为了可写,那么连接成功;如果返回2,即描述字变为即可读又可写,那么出错;如果返回0,那么超时;

可我想超时之后还重试几次,我直接使用循环的话,会出Operation is already in progress.的错。
应该怎么办?
发表于 2004-5-5 08:27:09 | 显示全部楼层
重试应该还要多停留一段时间,系统的套接字还没有释放占用的端口。
 楼主| 发表于 2004-5-5 11:14:25 | 显示全部楼层
最初由 kj501 发表
重试应该还要多停留一段时间,系统的套接字还没有释放。

那我应该停留多长时间呢?
或者我能不能叫系统提前释放呢?
发表于 2004-5-5 16:35:52 | 显示全部楼层
其实这是connect()函数决定了的。
http://www.gnu.org/software/libc ... ing.html#Connecting
只能用select或者poll查询,一旦socket可写就返回。
 楼主| 发表于 2004-5-5 16:58:19 | 显示全部楼层
也就是说,我没法在connect认为timeout之前,再对同一个套接字进行connect?

我现在用的一个办法是在先将它释放,然后重新创建一个套接字,并把它赋给前面的那个套接字。
发表于 2004-5-6 09:44:42 | 显示全部楼层
我觉得你的理解也不完全正确。但我对网络编程也只是懂点皮毛,无双兄在就好了。
 楼主| 发表于 2004-5-6 13:46:39 | 显示全部楼层
最初由 kj501 发表
我觉得你的理解也不完全正确。但我对网络编程也只是懂点皮毛,无双兄在就好了。


还是很感谢,我在loveunix上也问了(无双似乎在那比较多),还没人回复。
发表于 2004-5-7 20:03:44 | 显示全部楼层
你是如何重试几次的?
如果是再次select应该没有问题啊。你不是又从头又运行connect了吧?
 楼主| 发表于 2004-5-7 20:42:26 | 显示全部楼层
最初由 yuancc 发表
你是如何重试几次的?
如果是再次select应该没有问题啊。你不是又从头又运行connect了吧?

对呀
我就是再次connect呀,这样不行吗?
发表于 2004-5-7 20:54:18 | 显示全部楼层
你是准备又连到另外一个地址吗,还是继续前一个?
EINPROGRESS,那说明connect还在继续,因此在系统完成之前,你就不能再调用了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表