我的服务器代码基于 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/