【问题标题】:C parsing HTTP Chunked transfer encoding responseC解析HTTP Chunked传输编码响应
【发布时间】:2012-07-22 04:51:31
【问题描述】:

我正在开发一个需要解析 Chunked-type HTTP 传输的客户端。我已经拼命想通过以下内容找出错误,如果有人能够更快地发现我的错误,我将不胜感激。总结一下这个问题:似乎客户端没有收到所有的块,从而搞砸了剩下的过程。提前致谢!

 while(cflag){
    pfile_chunk = malloc(CHUNK_SIZE+1);
    memset(pfile_chunk, 0, CHUNK_SIZE);
    cPtr = pfile_chunk;
    cPtr2 = NULL;
    k=0;
    while(*(cPtr-1) != '\n'){
        k++;
        recv(sock, cPtr, 1, 0);
        cPtr = pfile_chunk+k;
    }
    cPtr2 = strchr(pfile_chunk, '\r');
    *cPtr2 = '\0';
    sscanf(pfile_chunk, "%x", &l);
    if(l == 0)
        break;
    printf("\nServer wants to deliver %ld bytes.\n", l);
    pfile_chunk = realloc(pfile_chunk, l+1);
    memset(pfile_chunk, 0, l);
    recv(sock, pfile_chunk, l, 0);
    fputs(pfile_chunk, f);
    printf("GOT THIS, SIZE %ld:\n%s\n", strlen(pfile_chunk), pfile_chunk);
    //get next \r\n bytes.
    recv(sock, NULL, 2, 0);
}

【问题讨论】:

  • 我为草率的代码提前道歉,这或多或少是我尝试了许多不同的事情的结果。
  • 您介意发布您的最终清理代码吗?我也在为这项任务而苦苦挣扎。不确定如何协调从缓冲区读取的内容与实际的 HTTP 块。在解析块之前是否存储了整个 HTTP 响应?

标签: c http chunked-encoding transfer-encoding http-chunked


【解决方案1】:

看起来您对while 循环中的检查的第一次取消引用将在您的数组开始之前访问,这可能不是所需的行为。希望该内存位置通常不会包含\n。这可能会搞砸你的read。我预计它可能包含一些与您的malloc 相关的信息,这不太可能是\n,因此您可能永远不会从中看到问题。

另外,希望您可以相信套接字的另一端在他们给您\n 之前不会发送超过CHUNK_SIZE+1。否则,它可能会出现段故障。不过,通常情况下,我希望发送者只发送 10 个或更少的 ASCII 数字字符和一个 CRLF 用于块标头,但理论上他们可以发送一堆长的块扩展标头字段。

除此之外,user315052 已经发现了一个更重要的问题,您应该告诉 recv 方法等待您请求的所有数据,或者检查它实际读取了多少数据。

【讨论】:

    【解决方案2】:

    至少,您应该检查recv 的返回值,看看您是否获得了您期望获得的字节数。

    在网络上肯定可以进行短读,因为系统调用将在您进行调用时返回套接字接收缓冲区中可用的任何内容。

    实现一个循环,直到您读入整个块,或者将MSG_WAITALL 标志传递给最后一个参数中的recv。但是,您仍然需要检查来自recv 的错误。

    ssize_t r = recv(sock, pfile_chunk, l, MSG_WAITALL);
    if (r < l) {
        /* check for errors ... */
    } else {
        /* got the data */
    }
    

    【讨论】:

    • 谢谢先生,我什至没有考虑发送/接收标志。错误检查不存在,因为我一直在匆忙移动草率的代码。欣赏它!有人 +1 这个人,我没有所需的声誉。
    猜你喜欢
    • 2013-09-29
    • 2011-01-08
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    相关资源
    最近更新 更多