2

ここで奇妙な問題。MySQL C ライブラリを使用して作成した C++ アプリケーションがあります。次のことを行います。

  • リモートの MySQL サーバーに接続します
  • いくつかのデータを取得します
  • データを分析する
  • 結果をDBサーバーにプッシュします
  • データベースを閉じる

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 クライアントは、同一の資格情報を使用して、この同じボックスから接続できます。

これらのシステムはすべて、企業のファイアウォール内にあり、同じグループによって実行されています。したがって、それらはすべて非常によく似た構成を持つ必要があります。

何か案は?ありがとう

4

2 に答える 2

2

わかりました、Alexis Wilke はそれを理解しました。これはポートの問題ですが、これがどのように起こっているのかはまだわかりません. mysql_real_connect() の 6 番目の引数はポート番号です。0 は、デフォルトのポート (3306) を使用する必要があることを示します: http://dev.mysql.com/doc/refman/5.7/en/mysql-real-connect.html

port が 0 でない場合、値は TCP/IP 接続のポート番号として使用されます。ホスト パラメータによって接続のタイプが決まることに注意してください。

デフォルトのポートは 3306 です。明示的に 3306 を指定すると、接続が機能します。このボックスのそのポートにデフォルト設定されていない理由や、使用しようとしているポートがわかりません。繰り返しますが、この同じ実行可能ファイルは、6 番目の引数が 0 の非常によく似た構成の他のいくつかのボックスで動作します。そして、私はその同じ接続コードを何年も使用してきましたが、これまでに見たことはありません. 非常に奇妙な。

このバージョンのライブラリのバグでしょうか? とはいえ、これほど大きくて精妙でないものについては、それはかなりありそうにないように思えます。

于 2013-11-13T17:34:58.827 に答える