我需要从http请求中找出请求的URL,但似乎没有。
例如,当我输入此
时http://127.0.0.1:8080/heththethetkj909
请求不包含网址
GET /favicon.ico HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.43 Safari/536.11
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
n-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
f-8;q=0.7,*;q=0.3
我的代码是
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <err.h>
char response[] = "HTTP/1.1 200 OK\r\n"
"Content-Type: text/html; charset=UTF-8\r\n\r\n"
"<doctype !html><html><head><title>Bye-bye baby bye-bye</title>"
"<style>body { background-color: #111 }"
"h1 { font-size:4cm; text-align: center; color: white;"
" text-shadow: 0 0 2mm black}</style></head>"
"<body><h1>Goodbye, world!</h1></body></html>\r\n";
int main()
{
int one = 1, client_fd;
struct sockaddr_in svr_addr, cli_addr;
socklen_t sin_len = sizeof(cli_addr);
char send_data [1024] , recv_data[2048];
int bytes_recieved ;
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0)
err(1, "can't open socket");
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int));
int port = 8080;
svr_addr.sin_family = AF_INET;
svr_addr.sin_addr.s_addr = INADDR_ANY;
svr_addr.sin_port = htons(port);
if (bind(sock, (struct sockaddr *) &svr_addr, sizeof(svr_addr)) == -1) {
close(sock);
err(1, "Can't bind");
}
listen(sock, 5);
while (1) {
client_fd = accept(sock, (struct sockaddr *) &cli_addr, &sin_len);
printf("got connection\n");
bytes_recieved = recv(client_fd,recv_data,2048,0);
printf(recv_data);
if (client_fd == -1) {
perror("Can't accept");
continue;
}
write(client_fd, response, sizeof(response) - 1); /*-1:'\0'*/
close(client_fd);
}
}
答案 0 :(得分:1)
在HTTP请求的前两行中,我们有
GET /favicon.ico HTTP / 1.1
主持人: 127.0.0.1:8080
这与127.0.0.1:8080/favicon.ico
相对应。
什么是favicon.ico?您是否注意到在浏览器中访问stackoverflow时,地址栏左侧或标签栏页面标题左侧会出现stackoverflow图标。那是图标。浏览器会在您访问任何网站时尝试加载,并将其用作图片。有关favicon的详细信息,请参阅wikipedia - favicon。
如上所述,这个http请求根本不适用于http://127.0.0.1:8080/heththethetkj909
。因此,你肯定不会看到它。在这种情况下,HTTP请求的前两行将读取
获取 / heththethetkj909 HTTP / 1.1
主持人: 127.0.0.1:8080
服务器可能同时打开两个连接到您的Web服务器。一个用于/heththethetkj909
,另一个用于/favicon.ico
。我实际上不确定为什么你遇到问题,因为你的原始代码似乎处理多个连接。也许这是与http持久性相关的问题。
尝试在http响应的标头中添加“连接:关闭”。这可能有所帮助。
如果你只是想尝试一个不能处理这个的非常基本的实现,可以考虑尝试一个不同的浏览器,它可能有不同的加载favicon的时序行为,或者一个非常旧的浏览器不知道favicon,或者不是浏览器的东西,例如linux中的curl http://127.0.0.1:8080/heththethetkj909
或Windows中的记事本(是的,你可以在记事本的打开对话框中输入一个url)。
答案 1 :(得分:0)
您的浏览器发送2个HTTP请求:
我不记得两者是否将通过相同的连接发送,或者它将是2个TCP连接。 您可以使用自己喜欢的网络嗅探器(例如Wireshark - Windows / Linux,tcpdump - Linux)进行检查。
答案 2 :(得分:0)
您正在使用浏览器进行测试的任何更改?
http://en.wikipedia.org/wiki/Favicon
在运行测试时尝试使用Curl。
类似的东西:
curl http://127.0.0.1:8080/heththethetkj909
答案 3 :(得分:0)
该行
GET /favicon.ico HTTP/1.1
表示浏览器正在尝试获取该站点的图标图像。这是不您感兴趣的请求。您还应该看到一个单独的请求
GET /heththethetkj909 HTTP/1.1