我有一个小型 C 代理服务器,我只想一次从客户端获取一个请求,然后从服务器发回响应。没有流水线,没有任何先进的东西,只是一个持久的 http 连接。
结构:
typedef struct http_request {
char* h_data; // Header raw data
int h_size; // Header size
char host[5000]; // Host to connect to
char resource[5000]; // Resource to get
} http_request;
typedef struct http_response {
char* h_data; // Header raw data
int h_size; // Header size
char* b_data; // Body raw data
int b_size; // Content-length of the body
} http_response;
代码:
while(1){
// Waiting for user to connect
int sock_user = accept(sock, (struct sockaddr*)NULL, NULL);
int sock_host=-1;
// Accept 1 request at a time and respond
while(1){
http_request req;
http_response resp;
// 1. Client ==> Proxy Server
http_parse_request(sock_user, &req); // uses recv(sock_user)
// 2. Client Proxy ==> Server
if (sock_host < 0)
sock_host=proxy_connect_host(req.host);
write(sock_host, req.h_data, req.h_size);
// 3. Client Proxy <== Server
http_parse_response(sock_host, &resp); // uses send(sock_host)
// 4. Client <== Proxy Server
write(sock_user, resp.h_data, resp.h_size);
write(sock_user, resp.b_data, resp.b_size);
}
}
现在这适用于几个第一页。然后程序在第 1 步阻塞,浏览器一直显示Waiting for www.calcoolate.com...
。
萤火虫:
所有这些GET都是发送到我的代理的请求。然而,我只收到前两个。我仔细检查了每个的返回值,write()
它们recv()
似乎与预期的完全匹配。我检查了 -1 和 0。
我的代理的逻辑一定有问题。有什么想法吗?