2010-03-07 155 views
1

我正在写一个小项目,它使用HTTP 1.1 GET和POST与一组服务器进行交互。服务器给了我一些标题行之后的响应,所以我尽管使用strtok()函数使用\n作为分隔符,但每当我尝试这样做时就会崩溃。如何解析C中的HTTP响应?

有没有简单的方法来解析C中的HTTP响应?我不想为此使用第三方库,但如果它真的需要,我不会有任何问题。

非常感谢您的一切。

编辑:下面是一些示例代码,只是想打印线:

char *response = "HTTP/1.1 200 OK\nServer: Apache-Coyote/1.1\nPragma: no-cache" 

char *token = NULL; 
token = strtok(response, "\n"); 
while (token) { 
    printf("Current token: %s.\n", token); 
    token = strtok(NULL, "\n"); 
} 
+2

请发布您的代码 – 2010-03-07 04:41:47

+1

当在一个线程或多进程程序中使用时,可能需要使用'strtok_r()'来保证安全,如果可用的话,请考虑使用它 – mctylr 2010-03-07 05:07:41

+0

试图修改来自'“...”'字符串文字的字符数组的任何元素都是**未定义的行为**;请参阅http://c0x.coding-guidelines.com/6.4.5.html和http://www.catb.org/jargon/html/N/nasal-demons.html。 – ephemient 2010-03-07 05:47:02

回答

5

http-parser是用C语言编写的Node.js的项目

这是一个简单和超快速HTTP解析器只有2个C文件,没有任何外部依赖。

+0

它是用回调式编写的,以支持“轮询”循环。也许作者对阻塞解析器感兴趣,比如'golang'的[ReadRequest](http://golang.org/pkg/net/http/#ReadRequest) – 2015-02-16 09:55:50

+0

有没有一个客户端用C语言编写的解析器?存储库附带的示例对于像我这样的新手来说似乎不够。 – Bharat 2017-02-20 20:14:21

4

您发布的代码中的问题非常简单:strtok通过修改您传递给它的字符串来工作。修改字符串文字会导致未定义的行为。你的代码一个真正的微小变化让它工作(我还率领适当的标题,并移动可执行部分成一个函数:

#include <string.h> 
#include <stdio.h> 

char response[] = "HTTP/1.1 200 OK\nServer: Apache-Coyote/1.1\nPragma: no-cache"; 

int main() { 
    char *token = NULL; 
    token = strtok(response, "\n"); 
    while (token) { 
     printf("Current token: %s.\n", token); 
     token = strtok(NULL, "\n"); 
    } 
    return 0; 
} 

在实际使用时,你会被读取HTTP响应成无论如何缓冲区;你遇到的问题仅仅出现在你生成的一个简单的测试用例中,同时它也指出strtok是一个功能设计很差的事实,你几乎肯定会用其他的东西。

+0

不确定为什么你认为这个问题反映了strtok上的poorl。真正的问题是,字符串文字被认为是“char *”而不是“const char *”,并且该问题可能会影响修改字符串输入的任何代码。 – 2010-03-07 06:27:06

+0

它反映了'strtok'糟糕,因为它不必要地限制了它的输入范围,不仅仅是可以修改的数据,而且你不介意在使用过程中基本破坏。 – 2010-03-07 07:06:54