2013-06-03 45 views
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; 

} 
+0

請具體指出失敗的原因。查詢是否成功,但返回一個空集?由於某種原因,C函數是否出錯? –

+0

它是如何失敗的? mysql返回的錯誤是什麼?如果崩潰 - 堆棧跟蹤是什麼? – viraptor

+0

該函數返回0,並在此失敗res = mysql_use_result(conn); – opc0de

回答

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(); 
    } 

如果解析度爲NULL,你不清理!

+0

我會盡力清理並重新回到周到,謝謝 – opc0de

相關問題