c - 无法从 C 中的 HTTP 请求获取路径和方法

标签 c sockets http

我的服务器代码基于 this ,虽然我修改了 deal_with_data 函数,看起来像这样:

void dealWithData (int list, void (*callback)(struct Request, int socket)) {
    char buffer[8196];
    int n;

    if (sock_gets(connectlist[list], buffer, 8196) < 0) {
        close(connectlist[list]);
        connectlist[list] = 0;
    } else {
        n = read(connectlist[list], buffer, sizeof(buffer));
        buffer[n] = 0;

        printf("%s\n", buffer);
        struct Request req = parseRequest(buffer, n);
        callback(req, connectlist[list]);

        close(connectlist[list]);
        connectlist[list] = 0;
    }

}; 

我从 printf 得到的数据是这样的:

Host: 127.0.0.1:8888
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:31.0) Gecko/20100101 Firefox/31.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

第一行没有出现路径、方法和协议(protocol),我猜是收到了,但不知道为什么没有收到,可能是因为异步函数?我以同步的方式做一个 HTTP 服务器,它完美地得到了那条线。也许是因为我读取套接字数据的方式?

感谢进阶!

最佳答案

几乎可以肯定 sock_gets() 正在读取您的第一行,然后您只是在随后调用 read() 时覆盖它。尝试更改为:

} else {
    printf("%s\n", buffer);    /*  <--- Add this line  */

    n = read(connectlist[list], buffer, sizeof(buffer));
    buffer[n] = 0;

    printf("%s\n", buffer);

您应该会看到第一行。

或者,要将所有内容都放在一个字符串中,假设 sock_gets() 的行为类似于 gets() 并去除换行符:

} else {
    size_t offset = strlen(buffer);
    buffer[offset] = '\n';

    n = read(connectlist[list], buffer + offset + 1,
             sizeof(buffer) - offset - 1);
    buffer[n + offset + 1] = 0;

    printf("%s\n", buffer);

顺便说一句,请注意 HTTP 行以 CRLF 结尾。 sock_gets() 可能会为您手动进行转换,但如果直接调用 read(),您就必须自己进行转换。否则,您将使用 printf() 调用打印一堆 \r 字符。

关于c - 无法从 C 中的 HTTP 请求获取路径和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25696197/

相关文章:

java - 客户端-服务器应用程序。总是打开套接字

performance - 用于无限滚动查询结果的 REST Api

c++ - 为什么多个减量运算符在 C++ 中工作时不能在 C 中工作?

c# - 在非托管内存中保存对托管对象的引用

C 套接字和 openssl (RSA)

c# - C# Web 代理中的 SSL;如何确定请求是否为 SLL?

jquery - Ajax——防止 100 继续行为

Php脚本获取json字符串中目录中所有图像的url

c - 在 64 位中将地址空间大小保持为 4 GB

c - C 中整数的顺序颠倒