我有一个很小的C代理服务器,我只想从客户端一次获取并从服务器发回响应。 没有流水线,没有任何高级功能,只是一个持久的http连接。
的Structs:
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。
我的代理逻辑一定有问题..有什么想法吗?