非阻塞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来等待套接字变为可读或可写。

猜你喜欢

转载自blog.csdn.net/qdslp/article/details/20535973
今日推荐