C HTTP代理,浏览器显示;“等待”;坚定地
我很难在C语言中实现代理服务器。它可以在最初的几个网页上运行,但在等待新的请求时,我被阻止了 设计:C HTTP代理,浏览器显示;“等待”;坚定地,c,sockets,http,proxy,blocking,C,Sockets,Http,Proxy,Blocking,我很难在C语言中实现代理服务器。它可以在最初的几个网页上运行,但在等待新的请求时,我被阻止了 设计: Firefox -> Proxy -> Webserver --. Firefox <- Proxy <- Webserver <-' 日志: -------- ----成功响应4个请求后---- 客户端==>代理服务器 收到389份 客户端代理==>服务器 发送。。389 发送389 客户端代理您必须非常小心,不要读取太多数据。例如,确保: 标题在双CRLF之
Firefox -> Proxy -> Webserver --.
Firefox <- Proxy <- Webserver <-'
日志:
--------
----成功响应4个请求后----
客户端==>代理服务器
收到389份
客户端代理==>服务器
发送。。389
发送389
客户端代理您必须非常小心,不要读取太多数据。例如,确保:
- 标题在双CRLF之前为只读;存储额外数据并随正文一起发送
- 在服务器发送完整的头之前,不会开始发送正文(不适用于此GET情况,但对于POST或CONNECT很重要)
- 仅从正文接收和发送内容长度字节
这适用于客户端->代理请求和服务器->代理响应
示例代码处于一个无止境的循环中(while(1)…
)。如何中止此操作?您是否尊重“代理连接”标题?谢谢您的评论。我做了所有的解析,现在我确信解析是正确的。不过还是一样的问题。我的怀疑是,客户端发送了一系列请求,而我从未recv()
“strace-s 9999-erecv,send-p”可能会有所帮助。谢谢。很好的建议,但这只是确认接收和发送的实际数据是相同的,并且格式正确。
puts("Waiting for user to connect..");
int sock_user = accept(sock, (struct sockaddr*)NULL, NULL);
int sock_host = -1;
printf("User connected.\n");
// Accept requests
while(1){
http_request req;
http_response resp;
// 1. Client ==> Proxy Server
http_parse_request(sock_user, &req); // uses recv()
// 2. Client Proxy ==> Server
if (sock_host < 0)
sock_host = proxy_connect_host(req.header->host);
write(sock_host, req.header->raw_data, req.header->raw_size);
// 3. Client Proxy <== Server
http_parse_response(sock_host, &resp); // uses recv()
// 4. Client <== Proxy Server
write(sock_user, resp.header->raw_data, resp.header->raw_size);
write(sock_user, resp.body ->first_block->data, resp.body ->first_block->size);
}
---- ......................................... ----
---- after succesfully responded to 4 requests ----
Client ==> Proxy Server
Received 389
Client Proxy ==> Server
Sending.. 389
Sent 389
Client Proxy <== Server
Got header 312
Got body 1437
Response total 1749
Client <== Proxy Server
Sending header.. 312
Sent 312
Sending body.. 1437
Sent 1437
Client ==> Proxy Server
---- Hangs/blocks here ----