簡體   English   中英

MySQL Windows c API命名管道錯誤:“在'等待初始通信數據包'時與MySQL服務器的連接丟失,系統錯誤:0

[英]MySQL Windows c api named pipes ERROR: "Lost connection to MySQL server at 'Waiting for initial communication packet', system error: 0

我正在寫一個c ++程序,它將所有內容存儲在mysql數據庫中。 我想避免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防火牆彈出以外,其他所有功能都可以正常工作。 我真的很想在不要求用戶單擊防火牆窗口上的“取消”的情況下進行此工作。

任何幫助都非常感謝!

如果MySQL是有意僅本地的,則應將其配置為僅在本地地址上偵聽。 將其放在您的my.cnf文件中:

bind-address     = 127.0.0.1

否則,請使用netsh advfirewall或類似工具將防火牆配置為允許MySQL。 通常,在安裝MySQL時即可完成。

例子:

或從腳本:

對於沒有或需要管理員特權的一次性安裝,您可以使用不可路由的IP地址和隨機端口來配置本地通信。

您可以通過在命令行中添加--bind-address=127.0.0.1 --port=62190來實現。

除非您是管理員,否則您將無法更改防火牆規則,並且偵聽命名管道通常也需要管理權限。 創建共享內存部分需要SeCreateGlobalPrivilege,因此本質上是相同的限制。

即使使用當前C連接器6.0.2中的管理員運行的mysql服務器,這也是一個問題,該錯誤已在此處報告: http ://bugs.mysql.com/bug.php?id= 41860我需要查找以下版本沒有它的mysql C連接器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM