【问题标题】:mysql remote connection - mysql CL client works, C++ app doesn'tmysql 远程连接 - mysql CL 客户端有效,C++ 应用程序无效
【发布时间】:2013-11-12 23:16:40
【问题描述】:

这里有一个奇怪的问题。 我有一个使用 MySQL C 库编写的 C++ 应用程序。它执行以下操作:

  • 连接到远程 MySQL 服务器
  • 检索一些数据
  • 分析数据
  • 将结果推送回数据库服务器
  • 关闭数据库

CentOS 6 上的 MySQL 服务器是 v5.1.61 客户端在各种 Linux 发行版的命令行上运行良好 - CentOS 6、Ubuntu、Scientific Linux 6.4

除了一台特定的 Scientific Linux 6.3 机器外,它在所有这些机器上都能正常工作。恰好是簇头节点 - 即。我需要去哪里才能获得真正的马力!

当我尝试在这里运行它时,我得到以下信息:

2003    :       Can't connect to MySQL server on 'hostname' (111)

AFAIK,这通常表示权限或网络问题。

但是,我可以使用相同的凭据通过 mysql 命令行客户端连接到服务器。

我尝试过的:

  • 使用命令行 mysql 客户端从问题机器连接到服务器。排除权限问题或错误凭据。
  • 在这个盒子上重新编译了 C++ exe (g++ 4.4.7) 以确保它不是某种库不兼容。没有变化。
  • 我已经用相同的行为尝试了服务器主机名和 IP 地址。排除名称解析问题。
  • 尝试使用我的 exe 和 CL 客户端连接到不同的 MySQL 服务器 - 行为相同。表示客户端问题而不是特定的 mysql 服务器

C++ 代码使用 mysql C 库中的 mysql_real_connect()。多年来,我在许多不同的程序和许多不同的数据库中都使用了相同的连接代码——它可以工作。到现在为止。

int MakeDbConnect(MYSQL **db, const string &dbserver, const string &dbname,
                  const string &dbuser, const string &dbpasswd)
{
   *db = mysql_init(NULL);

   if (mysql_real_connect(*db, dbserver.c_str(), dbuser.c_str(),
                          dbpasswd.c_str(), dbname.c_str(), 0, NULL, 0) == NULL)
   {
      cout << "ERROR: Call to mysql_real_connect() failed:\t"
           << mysql_errno(*db) << "\t:\t" << mysql_error(*db) << endl;
      cout << "\tServer:  \t" << dbserver << endl;
      cout << "\tDatabase:\t" << dbname << endl;
      cout << "\tUser:    \t" << dbuser << endl;

      return -1;
   }

   return 0;
}

再说一遍

  • 这个可执行文件可以在其他几个 linux 机器上正常运行。
  • 它没有从一个特定的盒子连接
  • linux 命令行 mysql 客户端可以使用相同的凭据从同一框进行连接

所有这些系统都在我们公司的防火墙内,并由同一组运行。所以他们应该都有一个非常相似的配置。

有什么想法吗? 谢谢

【问题讨论】:

  • 我注意到您的失败消息代码包括回显给您的 dbserver、dbname 和 dbuser。所以大概你在那里看到了预期值。考虑包含 dbpassword 以查看该值是否也符合预期。
  • 它将确保使用默认端口以及是否存在阻止连接的防火墙规则。
  • AllInOne - 是的,连接参数的回显是正确的。此特定连接不使用密码 - 内部项目等等。
  • Alexis - 我假设命令行客户端使用与基于 C 库的连接相同的端口。命令行客户端可以工作,所以我假设端口没问题。将对此进行调查,看看他们是否使用不同的端口 - 这肯定可以解释它。

标签: c++ mysql c


【解决方案1】:

好的,亚历克西斯·威尔克明白了——有点意思。这是一个端口问题,尽管我仍然不确定这是如何发生的。 mysql_real_connect() 的第 6 个参数是端口号。 0 表示应该使用默认端口(3306):http://dev.mysql.com/doc/refman/5.7/en/mysql-real-connect.html

如果端口不为 0,则该值用作 TCP/IP 的端口号 联系。请注意,主机参数决定了 连接。

默认端口是 3306。如果我明确地将 3306 放在那里,则连接正常。不知道为什么它没有默认使用这个盒子上的那个端口或它试图使用的端口。同样,这个相同的可执行文件适用于其他几个配置非常相似的盒子,第 6 个参数为 0。而且我多年来一直在使用相同的连接代码,以前从未见过这种情况。很奇怪。

也许这个版本的库中存在错误?虽然对于这么大而微妙的事情来说,这似乎不太可能。

【讨论】:

    【解决方案2】:

    嗯,我遇到了类似 CoAstroGeek 的问题。

    我可以在 localhost 中连接到 MySQL 数据库,但不能在远程主机中连接,因为我没有明确指定端口。当我指定 _iPort = 3306 时,它起作用了!感谢 CoAstroGeek 和 Alexis!

    bool DBConnectorMySQL::connect(bool bDebug)
    {
        _pMySQL_Conn = mysql_init(NULL);
        my_bool myb = true;
        mysql_options(_pMySQL_Conn, MYSQL_OPT_RECONNECT, &myb);
        if (_bEnableSetEncodingUTF8)
        {
            mysql_options(_pMySQL_Conn, MYSQL_SET_CHARSET_NAME, "utf8");
            mysql_options(_pMySQL_Conn, MYSQL_INIT_COMMAND, "SET NAMES `utf8`");
        }
        if (mysql_real_connect(_pMySQL_Conn, _sHost.c_str(), _sUsername.c_str(),
                _sPwd.c_str(), _sDatabase.c_str(), _iPort, NULL, 0) == NULL)
        {
            if (bDebug) cerr << "Problem encountered connecting to the "
                    << _sDatabase << " database on " << _sHost << endl;
            cout << "mysql_error: #" << mysql_errno(_pMySQL_Conn) << " - "
                    << mysql_error(_pMySQL_Conn) << endl;
            _pErrorHandler->setErrorCode((int)DBCONNECTORMYSQL_CANNOT_CONNECT_DB);
            return false;
        }
        else
        {
            if (bDebug) cout << "Connected to the " << _sDatabase << " database on "
                    << _sHost << " as user " << _sUsername << endl;
            return true;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 2017-11-27
      相关资源
      最近更新 更多