C中的mysql_real_connect()失败并显示“用户拒绝访问”

时间:2017-03-15 21:33:29

标签: c linux mariadb access mysql-connector

我一直在处理这个问题,我找不到解决方案。 我无法使用mysql_real_connect()从C(fedora24)连接到mariadb。它始终失败,用户拒绝访问,错误代码1045,SQL状态28000

互联网上提出的所有解决方案都与错误的密码,错误的界面(例如localhost而不是127.0.0.1)或权限有关,因此人们无法使用sql客户端进行连接。 但事实是,我可以使用sql客户端,我的用户以及root连接。我只是不能用C功能。使用mysql -u -p既适用于root用户,也适用于我的用户(userdb)。我甚至使用phpMyAdmin,它适用于两个用户。

我明确连接到127.0.0.1,使用TCP套接字而不是Unix套接字,以便使用Wireshark监视消息。响应总是:

MySQL Protocol
Packet Length: 72
Packet Number: 2
Error Code: 1045
SQL state: 28000
Error message: Access denied for user 'root'@'localhost' (using password: YES)

root和localhost更改,具体取决于我使用root,userdb还是不同的接口。

如果我检查用户和密码,我就有这个:

MariaDB [mysql]> select user,host,password from mysql.user;
+--------+-----------+-------------------------------------------+
| user   | host      | password                                  |
+--------+-----------+-------------------------------------------+
| root   | localhost | *B94FFB596FCEC97E64467B3274F7C739C42FFA7A |
| root   | 127.0.0.1 | *B94FFB596FCEC97E64467B3274F7C739C42FFA7A |
| root   | ::1       | *B94FFB596FCEC97E64467B3274F7C739C42FFA7A |
| userdb | %         | *A2CF089828EE5EEA40C84C6454E97650B87345A9 |
+--------+-----------+-------------------------------------------+

我最简单的测试是:

void finish_with_error( MYSQL *con )
{
    fprintf( stderr, "%s\n", mysql_error( con ) );
    mysql_close( con );
    exit( EXIT_FAILURE );
}

int main( int argc, char **argv )
{
    MYSQL *con = mysql_init( NULL );

    if ( con == NULL )
    {
        fprintf( stderr, "%s\n", mysql_error( con ) );
        exit( EXIT_FAILURE );
    }

    if ( mysql_real_connect( con, "127.0.0.1", "root", "asd8814*",
                             "mysql", 0, NULL, 0 ) == NULL )
    {
        finish_with_error( con );
    }

有什么想法吗?

提前致谢。

路易斯

******** UPDATE *********

因为我确定权限和密码都没问题,因为我可以连接phyMyAdmin和mysql客户端,所以我开始检查密码验证。在我看来,这是唯一遗留下来的,只会导致C客户端而不是其他客户端出现问题。 Mariadb和我的C客户端都使用mysql_native_password,因为我可以使用Wireshark进行验证。

我删除了MariaDB中该用户的密码并成功连接。 之后我使用phpMyAdmin创建了一个新密码,但仍然成功连接。 可能看起来我的密码错了,但是,为什么我可以用phpMyAdmin和mysql客户端连接?

我用root用户重复了这个过程。我可以用root连接到phpMyAdmin,所以我删除了root@127.0.0.1的密码,但仍然无法从C连接。我删除了root @ localhost的密码,然后连接了C客户端。

第一个问题:如果我用127.0.0.1而不是localhost调用mysql_real_connect(),为什么它在root @ localhost上没有密码连接(我确认我使用的是使用Wireshark的TCP)

第二个问题:我使用phpMyAdmin为root @ localhost重新创建了相同的密码,现在C客户端也可以连接(如同mysql客户端和phpMyAdmin一样)。

这些问题的未知答案。我不知道为什么密码验证以前没有用,为什么它现在有效。

0 个答案:

没有答案