这里有奇怪的问题。 我有一个使用 MySQL C 库编写的 C++ 应用程序。它执行以下操作:
- 连接到远程 MySQL 服务器
- 检索一些数据
- 分析数据
- 将结果推送回数据库服务器
- 关闭数据库
MySQL 服务器是 CentOS 6 上的 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)
据我所知,这通常表示权限或网络问题。
但是,我可以使用相同的凭据通过 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 客户端可以使用相同的凭据从同一个盒子进行连接
所有这些系统都位于我们公司的防火墙内,并由同一组运行。因此它们应该具有非常相似的配置。
有什么想法吗? 谢谢
最佳答案
好吧,Alexis Wilke 明白了 - 有点。这是一个端口问题,尽管我仍然不确定这是如何发生的。 mysql_real_connect() 的第六个参数是端口号。 0 表示应使用默认端口 (3306):http://dev.mysql.com/doc/refman/5.7/en/mysql-real-connect.html
If port is not 0, the value is used as the port number for the TCP/IP connection. Note that the host parameter determines the type of the connection.
默认端口是 3306。如果我明确地将 3306 放在那里,连接就可以工作。不知道为什么它没有默认使用此盒子上的该端口或它尝试使用哪个端口。同样,这个相同的可执行文件可以在其他几个配置非常相似的盒子上运行,其中第六个参数为 0。我多年来一直使用相同的连接代码,但以前从未见过这种情况。非常奇怪。
也许这个版本的库有一个错误?尽管对于如此大且不微妙的事情来说,这似乎不太可能。
关于c++ - mysql 远程连接 - mysql CL 客户端可以工作,C++ 应用程序不能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19941961/