1

私は、私が作成した単純なルーティングデーモンを持っています。これは、他の IP の私の IP に到着するいくつかのパケットを自動的にルーティングします。デーモンはうまく動作しますが、しばらくすると、データベースから IP を取得する機能が失敗し、その理由がわかりません。

これが私のコードです:

#include "database.h"

BOOL getip(char * ip,int * port,BOOL serie)
{
        MYSQL * conn,mysql;
        MYSQL_RES * res;
        MYSQL_ROW row;

        char * server = "mysqldbhost";
        char * user = "mysqluser";
        char * pass = "mysqlpass";
        char * db = "databasenamehere";
        char * query = NULL;

        mysql_init(&mysql);

        conn = mysql_real_connect(&mysql,server,user,pass,db,0,NULL,0);
        if (conn == NULL){
                fprintf(stderr,"%s\n",mysql_error(conn));
                mysql_close(&mysql);
                mysql_library_end();
                return false;
        }

        query = malloc(255);

        if (strlen(ip) > 30)
        {
                fprintf(stderr,"INVALID IP SIZE!");
                mysql_close(&mysql);
                mysql_close(conn);
                mysql_library_end();
                return false;
        }


        if (serie)
                sprintf(query,"SELECT client_ip,client_port FROM routing WHERE serie_cartela=\"%s\"",ip);
        else
        sprintf(query,"SELECT client_ip,client_port FROM routing WHERE cartela_ip=\"%s\"",ip);


        if (mysql_query(conn,query)){
                free(query);
                fprintf(stderr,"%s\n",mysql_error(conn));
                mysql_close(&mysql);
                mysql_close(conn);
                mysql_library_end();
                return false;
        }
        free(query);

        res = mysql_use_result(conn);
        if (res != NULL)
        {
                row = mysql_fetch_row(res);
                if ((row!=NULL) && (row[0] != NULL) && (row[1] != NULL))
                {
                strcpy(ip,row[0]);
                *port = atoi(row[1]);
                mysql_free_result(res);
                mysql_close(&mysql);
                mysql_close(conn);
                mysql_library_end();
                return true;
                }
                mysql_free_result(res);
                mysql_close(&mysql);
                mysql_close(conn);
                mysql_library_end();
        }

        return false;

}
4

1 に答える 1

1
    if (res != NULL)
    {
            row = mysql_fetch_row(res);
            if ((row!=NULL) && (row[0] != NULL) && (row[1] != NULL))
            {
                strcpy(ip,row[0]);
                *port = atoi(row[1]);
                mysql_free_result(res);
                mysql_close(&mysql);
                mysql_close(conn);
                mysql_library_end();
                return true;
            }
            mysql_free_result(res);
            mysql_close(&mysql);
            mysql_close(conn);
            mysql_library_end();
    }

res が NULL の場合、クリーンアップは行われません!

于 2013-06-03T15:27:49.590 に答える