我的microhttpd服务器有问题,我自己无法解决。我正在从SQLite数据库中读取一些数据,并尝试将其格式化为类似json的格式并将其发送给客户端。

 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中,但是我不知道为什么,因为我刚接触网络。任何帮助,将不胜感激。

最佳答案

我认为问题来自MHD_create_response_from_buffer函数调用:


  缓冲区的内存管理选项;如果缓冲区是静态/全局内存,则使用MHD_RESPMEM_PERSISTENT;如果缓冲区是堆分配的,则使用MHD_RESPMEM_MUST_FREE;如果缓冲区在临时内存中(即在堆栈上),则应使用MHD_RESPMEM_MUST_COPY释放;如果缓冲区在临时内存中(即在堆栈上),则必须由MHD复制;


在排队响应时,应复制数据(MHD_RESPMEM_MUST_COPY代替MHD_RESPMEM_PERSISTENT):

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


因为在释放页面之前可能不会发送响应。

此外,一个http查询将仅期望一个响应。因此,您将必须构造一个更大的页面来一次发送所有内容:

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

关于c - Microhttpd服务器不想发送页面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37320902/

10-11 22:35
查看更多