сбой libmysql mysql_real_connect с IP-адресом, но работает с localhost

#c #mysql

#c #mysql

Вопрос:

Итак, моя проблема довольно проста, я относительно новичок в C , так что для некоторых это может быть простым ответом, но я использую libmysql для подключения к базе данных, и пока это работает именно так, как мне нужно. Но я хочу иметь возможность подключаться к базе данных, не найденной на локальном хосте, база данных все равно будет в моей локальной сети, но только не на локальном компьютере. Я почти уверен, что unix_socket параметр — это все, что мне нужно изменить, но я понятия не имею, как или на что его изменить или как создать «unix_socket». Ниже я опубликую свой код и заранее поблагодарю вас за помощь спасибо!

 void readFromDB(){
skip:
     MYSQL *connect; // Create a pointer to the MySQL instance
connect=mysql_init(NULL); // Initialise the instance
/* This If is irrelevant and you don't need to show it. I kept it in for Fault Testing.*/
if(!connect)    /* If instance didn't initialize say so and exit with fault.*/
{
    fprintf(stderr,"MySQL Initialization Failed");


}
/* Now we will actually connect to the specific database.*/

connect=mysql_real_connect(connect,"10.1.3.253",USER,PASSWORD,DATABASE,3306, NULL,0);
/* Following if statements are unneeded too, but it's worth it to show on your
first app, so that if your database is empty or the query didn't return anything it
will at least let you know that the connection to the mysql server was established. */

if(connect){
    printf("First Connection Succeededn");
            system("PAUSE");
}
else{
    printf("Connection Failed!n");
            Sleep(800);
            goto skip;
}
MYSQL_RES *resu< /* Create a pointer to recieve the return value.*/
MYSQL_ROW row;  /* Assign variable for rows. */

//mysql_query(connect,"SELECT * FROM locationTime");
/* Send a query to the database. */
    if(!(mysql_query(connect,"SELECT * FROM locationtime") == 0)){
            mysql_close(connect);
            Sleep(300);
            goto skip;
    }
result = mysql_store_result(connect); /* Receive the result and store it in res_set */


unsigned int numrows = mysql_num_rows(result); /* Create the count to print all rows */

/* This while is to print all rows and not just the first row found, */
    if(numrows != 0){
            while ((row = mysql_fetch_row(result)) != NULL){
                    ids.push_back(row[0]);
                    dateTime.push_back(row[1]);
                    locs.push_back(setLocation(row[2]));
                    strLocs.push_back(row[2]);
                    imgPaths.push_back(row[3]);

                    //for(int i = 0; i<(sizeof(row)  ); i  ){
                    //        //printf("%sn",row[i] != NULL ? row[i] : "NULL"); /* Print the     row data */
                    //}
                    //cout<<endl<<endl;
            }
    }else if(numrows <= 0){
            mysql_close(connect);   /* Close and shutdown */
            mysql_free_result(result);
            Sleep(200);
            goto skip;
    }
mysql_close(connect);   /* Close and shutdown */
    mysql_free_result(result);
return;
}
  

и вот мой заголовочный файл:

 #include "my_global.h" // Include this file first to avoid problems
#include "mysql.h" // MySQL Include File
#define SERVER "10.1.3.253"
#define USER "user"
#define PASSWORD "pass"
#define DATABASE "DBName"
  

Комментарии:

1. Почему вы используете модуль C в C , когда есть библиотека C , которая намного лучше?

2. Я не мог понять, как это использовать. Вся документация по нему, которую я смог найти, была не очень хорошей, и, как я уже сказал, я новичок в этом языке, поэтому я не был уверен, как его реализовать, и этот модуль казался очень простым и понятный

3. Я просто предупреждаю вас, что использование необработанной библиотеки C действительно очень раздражает, и не только из-за дополнительной работы, связанной с корректным управлением строками в стиле C. Если вы можете использовать библиотеку, подобную SQL API , вы, вероятно, избежите большей части этого. Документация по базовому адаптеру C невелика, но вам, вероятно, было бы проще разобраться в этом, чем отлаживать код вашей базы данных C.

4. Хорошо, спасибо за предупреждение, мне нужны все указатели (без каламбура), которые я могу получить.

Ответ №1:

Обычно, если у вас возникают проблемы с подключением по IP, это связано с тем, что вашей учетной записи пользователя не разрешено подключаться с «удаленного» адреса.

Обычно это исправляется:

 GRANT ALL PRIVILEGES ON *.* TO `user`@`%` IDENTIFIED BY '...'
  

Где user ваше имя пользователя. Очевидно, вы можете захотеть заблокировать доступ еще больше.

localhost это то, что используется для «локальных» подключений через сокет UNIX. Все остальные обрабатываются как удаленные.

Комментарии:

1. вы, сэр, потрясающий, я весь день возился с этим дерьмом, думая, что это что-то с моим кодом, у меня есть опыт работы с mysql и PHP, и мне даже в голову не приходило посмотреть на привилегии, вот почему я люблю stack overflow! большое спасибо, не могу поверить, что это было так просто