Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C HTTP代理,浏览器显示;“等待”;坚定地_C_Sockets_Http_Proxy_Blocking - Fatal编程技术网

C HTTP代理,浏览器显示;“等待”;坚定地

C HTTP代理,浏览器显示;“等待”;坚定地,c,sockets,http,proxy,blocking,C,Sockets,Http,Proxy,Blocking,我很难在C语言中实现代理服务器。它可以在最初的几个网页上运行,但在等待新的请求时,我被阻止了 设计: Firefox -> Proxy -> Webserver --. Firefox <- Proxy <- Webserver <-' 日志: -------- ----成功响应4个请求后---- 客户端==>代理服务器 收到389份 客户端代理==>服务器 发送。。389 发送389 客户端代理您必须非常小心,不要读取太多数据。例如,确保: 标题在双CRLF之

我很难在C语言中实现代理服务器。它可以在最初的几个网页上运行,但在等待新的请求时,我被阻止了

设计:

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 ----