2016-05-19 6 views
0

自分で解決できないmicrohttpdサーバーに問題があります。私はSQLiteデータベースからいくつかのデータを読んでおり、私はそれをjsonのようなフォーマットでフォーマットしてクライアントに送信しようとしています。Microhttpdサーバーがページを送信したくない

rc = sqlite3_exec(db, sql, callback, (void*)connection, &zErrMsg); 

コールバック:

int callback(void *connection, int argc, char **argv, char **azColName) 
{ 
    int i; 
    for(i=0; i<argc; i++) 
    { 
     char *display_page=malloc(1000); /* Size will be changed to fit, this is for testing.*/ 

     /* azColName = Name of the column in database */ 
     /* argv = value of the column*/ 

     sprintf(display_page, "{\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\"}\n", 
            azColName[i], argv[i] ? argv[i] : "NULL", 
           azColName[i+1], argv[i+1] ? argv[i+1] : "NULL", 
           azColName[i+2], argv[i+2] ? argv[i+2] : "NULL"); 

     printf("disp page= %s\n", display_page); 
     if (!send_page(connection, display_page)) 
      printf("failed\n"); 
     free(display_page); 
     i+=2; 
    } 
    return 0; 
} 

送信ページ:

send_page (struct MHD_Connection *connection, char *page) 
{ 
    int ret; 
    struct MHD_Response *response; 


    response = 
    MHD_create_response_from_buffer (strlen (page), (void *) page, 
        MHD_RESPMEM_PERSISTENT); 

    if (!response) 
    return MHD_NO; 

    ret = MHD_queue_response (connection, MHD_HTTP_OK, response); 
    printf("ret = %d\n", ret); 
    MHD_destroy_response (response); 

    return ret; 
} 

出力:

disp page= {"SUBJECT":"Todo1","DESCRIPTION":"asdf","URGENCY":"asdf"} 

ret = 1 
disp page= {"SUBJECT":"Todo2","DESCRIPTION":"NULL","URGENCY":"fdsa"} 

ret = 0 
failed 
disp page= {"SUBJECT":"Todo3","DESCRIPTION":"qwer","URGENCY":"qwer"} 

ret = 0 
failed 

問題はどこかMHD_queue_responseであるように思えるが、私は考えていますなぜ私はネットワーキングが初めてだからです。どんな助けもありがとう。

+1

だけで無関係なクエリを、なぜ '私は' for'ループ文で、 '++、および' I + = 2 'ループ本体でください:だから、一度にすべてを送信するために大きなページを作成する必要があります?実際のfor文の中で単に 'i + = 3'をしないのはなぜですか? –

+0

さて、それは反復ごとに1つのキー/ valペアであると考えられていましたが、私は最近それを変更し、下部にi + = 2を追加しました。それはリファクタで修正されるだろうが、それを指摘してくれてありがとう。 – Mirakurun

答えて

0

私は問題がMHD_create_response_from_buffer関数呼び出しから来ていると思う:バッファ用

メモリ管理オプション。バッファが静的/大域メモリの場合はMHD_RESPMEM_PERSISTENTを使用し、バッファがヒープ割り当てされている場合はMHD_RESPMEM_MUST_FREEを使用し、一時メモリ(つまりスタック上)にあるMHDによってMHDおよびMHD_RESPMEM_MUST_COPYを解放する必要があります。

あなたが応答をエンキューしているとして、あなたは(MHD_RESPMEM_MUST_COPY代わりのMHD_RESPMEM_PERSISTENT)データをコピーする必要があります

response = 
    MHD_create_response_from_buffer (strlen (page), (void *) page, 
        MHD_RESPMEM_MUST_COPY); 

ページを解放する前に応答が送信されない場合がありますので。

さらに、1つのhttpクエリでは、が1つだけ、と応答します。

int callback(void *connection, int argc, char **argv, char **azColName) 
{ 
    int i; 
    char *display_page = malloc(10000); /* Size will be changed to fit, this is for testing.*/ 

    for(i=0; i<argc; i+=) 
    { 
     char subpage[256] = ""; 

     sprintf(subpage, "{\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\"}\n", 
            azColName[i], argv[i] ? argv[i] : "NULL", 
           azColName[i+1], argv[i+1] ? argv[i+1] : "NULL", 
           azColName[i+2], argv[i+2] ? argv[i+2] : "NULL"); 

     printf("subpage= %s\n", subpage); 

     strncat(display_page, subpage, sizeof subpage-1);    

    } 
    if (!send_page(connection, display_page)) 
     printf("failed\n"); 
    free(display_page); 
    return 0; 
} 
+0

それは便利で、私はそれを適用しましたが、残念ながらそれは私の問題を解決しませんでした。 – Mirakurun

+0

私は1つのクエリが1つの応答しか期待していないと思います。回答が更新されました。 – purplepsycho

+0

これで何か変なことが起こっています。 "" if(!send_page(connection、display_page)) printf( "失敗\ n"); はループに含まれていませんが、それでも3回ループします。 出力は以前と同じです。 – Mirakurun

関連する問題