0

すべてをmysqlデータベースに保存するc ++プログラムを作成しています。Windows セキュリティ ウィンドウがポップアップして、mysqld が特権を持つことができるかどうかを確認するのを避けたいと思います。(ファイアウォール ウィンドウに応答して) キャンセルをクリックしても、すべてがローカルであるため、プログラムは問題なく動作します。

このファイアウォール ウィンドウを回避するために、 --skip-networking フラグを指定して名前付きパイプを使用しようとしています。

編集を開始:

mysqld のポータブル バージョンを使用しています。管理者権限はありません。(これが重要な情報であることを指摘してくれた Ben に感謝します)

編集終了

次のコマンドを使用して、mysqld サーバーを起動しています。

C:\tmp_report\12345\mysqld\mysql\bin\mysqld --user=root \
--basedir="C:\tmp_report\12345\mysqld\\mysql" \
--datadir="C:\tmp_report\12345\mysqld\data" \
--pid-file="C:\tmp_report\12345\mysqld\mysql.pid" \
--log-error="C:\tmp_report\12345\mysqld\mysql.err" \
--skip-networking \
--enable-named-pipe

これは機能し、次のコマンド ライン ステートメントを使用してデータベースに接続できます。

mysql --pipe -uroot 

次のようにc-apiを介して接続しようとしています:

unsigned int mysql_timeout=200;
unsigned int protocol=MYSQL_PROTOCOL_PIPE;
bool mysql_reconnect=true;
bool mysql_local_infile=true;

if (mysql_options(conn,MYSQL_OPT_CONNECT_TIMEOUT, (char *)&mysql_timeout)){*logstream<<"mysql option error connect_timeout";}

if (mysql_options(conn,MYSQL_OPT_READ_TIMEOUT, (char *)&mysql_timeout)){*logstream<<"mysql option error read_timeout";}

if (mysql_options(conn,MYSQL_OPT_WRITE_TIMEOUT, (char *)&mysql_timeout)){*logstream<<"mysql option error write_timeout";}

if (mysql_options(conn,MYSQL_OPT_RECONNECT,                   &mysql_reconnect)){*logstream<<"mysql option error reconnect";}

if (mysql_options(conn,MYSQL_OPT_LOCAL_INFILE,                &mysql_local_infile)){*logstream <<"mysql option error local_infile";}

if (mysql_options(conn,MYSQL_OPT_NAMED_PIPE,                  NULL)){*logstream<<"mysql option error MYSQL_OPT_NAMED_PIPE";}
if (mysql_options(conn,MYSQL_OPT_PROTOCOL,            (char *)&protocol))          {*logstream<<"mysql option error protocol";}

if (!mysql_real_connect(conn,
        "localhost", // SERVER
        "root",      // USER
        NULL,   // PASS
        NULL,   // DATABASE
        0,    // port
        NULL, // socket
        0     // client_flag
    )){
    *logstream<<"Database::connect mysql_real_connect failed"<<endl;
    *logstream<<mysql_error(conn)<<endl;
    conn=NULL;
}

この mysql_real_connect 呼び出しの結果は次のとおりです。

Database::connect mysql_real_connect failed
Lost connection to MySQL server at 'waiting for initial communication packet', system error: 0

TCPIP 接続を使用すると、Windows ファイアウォールがポップアップすることを除いて、すべて正常に動作します。ユーザーがファイアウォールウィンドウでキャンセルをクリックする必要なく、これを機能させたいと思います。

どんな助けでも大歓迎です!

4

2 に答える 2

1

MySQL が意図的にローカルのみである場合は、ローカル アドレスでのみリッスンするように構成する必要があります。my.cnfこれをファイルに入れてください:

bind-address     = 127.0.0.1

それ以外の場合はnetsh advfirewall、または同様の方法を使用してファイアウォールを構成し、MySQL を許可します。これは通常、MySQL をインストールするときに行います。

例:

またはスクリプトから:

管理者特権を持たない、または必要としない使い捨てインストールの場合、ルーティング不可能な IP アドレスとランダム ポートを使用してローカル通信を構成できます。

--bind-address=127.0.0.1 --port=62190これは、コマンド ラインに追加することで実現できます。

管理者でない限り、ファイアウォール ルールを変更することはできません。名前付きパイプをリッスンするには、通常、管理者権限も必要です。共有メモリ セクションの作成には SeCreateGlobalPrivilege が必要なため、基本的に同じ制限が適用されます。

于 2012-11-06T15:44:18.527 に答える
-1

これは、現在の C コネクタ 6.0.2 で管理者が実行する mysql サーバーでも問題です。バグはここで報告されました : http://bugs.mysql.com/bug.php?id=41860それを持っていないmysql Cコネクタ。

于 2012-11-26T16:50:21.987 に答える