非阻塞connect问题

        在发起一个网络连接时,如果不知道服务器是否正常,我们经常会阻塞在connect,在《linux网络编程》一书中讲述了使用select 实现非阻塞connect的方法,基本步骤如下:

1、创建 socket,返回套接字描述符;

2、调用 fcntl 或 ioctlsocket 把套接口描述符设置成非阻塞;

3、调用 connect 开始建立连接;

4、判断连接是否成功建立;

5、调用select 等待套接安变为可读或可写;

6、处理超时;

7、检查可读或可写条件;

8、关闭非阻塞状态并返回;

       一般情况下,这个方法会运行的很正常,但,让我们考虑以下这种情况:

    服务器使用epoll模式接受客户端连接,并且往一个中心服务器同步一些数据,当与中心服务器通信出现问题时,会断开连接并使用上面的非阻塞方法重新进行连接,这时问题就出现了,如果当时客户端连接数量大于FD_SETSIZE,并且有客户端不断进入,那服务器连接中心服务器时,创建的描述符值就可能大于FD_SETSIZE,这时使用select就会出错,造成服务器无法连接上中心服务器。

在上述情况中,需要改用poll或epoll方式替代select来等待套接字变为可读或可写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值