我的服务器代码基于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
包含路径,方法和协议的第一行没有出现,我猜是收到了但我不知道为什么没有得到,也许是因为异步功能?我以同步方式执行HTTP服务器,它完美地获得了该行。也许是因为我读取套接字数据的方式?
感谢先进!
答案 0 :(得分:2)
几乎可以肯定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()
调用,您必须自己进行翻译。否则,您将使用\r
调用打印一堆printf()
个字符。