在使用mysql_real_connect时,发现一个问题:如果连接一个网段在公司内网中的不存在IP时,mysql_rael_connect将会在约20秒后返回连接失败
如果连接一个网段在外网中的不存在IP时,mysql_real_connect将挂住,即使超过10分钟也不返回(即使使用mysql_options设置MYSQL_OPT_CONNECT_TIMEOUT也无效)测试的版本为5.0.95,比较老了
OS: SUSE Linux 3.0.13但使用5.5.28版本在Windows上测试时,
不论是不存在的IP是内网还是外网,mysql_real_connect都将在约20秒左右返回连接失败
请教大牛,是否这个问题与MySQL版本有关?查看过mysql_real_connect及其内部调用的相关函数代码,5.0.95和5.5.28没太看出来什么大的差别

解决方案 »

  1.   

    应该跟mysql版本无关。而跟linux和windows下的网络环境有关。
    你可以用telnet <IP> <端口号>来模拟一下。
      

  2.   


    顺便追问一个问题:为什么通过mysql_options设置MYSQL_OPT_CONNECT_TIMEOUT选项也仍然不能改变上述问题? 例如设置连接超时为10秒,实际情况仍然会超过10分钟?看过mysql官网关于设置MYSQL_OPT_CONNECT_TIMEOUT无效这个问题的一些说法,但是最后的不了了之
      

  3.   

    关于MYSQL_OPT_CONNECT_TIMEOUT这个参数, 估计在这种情况下都不起作用了。
      

  4.   


    试了一下,确实没什么效果,Windows和Linux   5.0.95和5.5.28都不起效
      

  5.   


    试了一下, 这个现象和telnet测试的结果比较符合,如果telnet IP  3306 出现超时的,用mysql_real_connect连接都有这个问题。但是如果telnet IP 3306被立即拒绝的,用mysql_real_connect也会在较短的时间内返回
      

  6.   

    解决方法是在mysql_real_connect()之前设置
    //设置连接等待时间,这里设置的是20秒
    int ml_outtime = 20;
    mysql_options(&mysql, MYSQL_OPT_CONNECT_TIMEOUT, &ml_outtime);//设置如果连接失败 不自动连接
    bool ml_false = false;
    mysql_options(&mysql, MYSQL_OPT_RECONNECT, &ml_false);