0

我有一个小型 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。

我的代理的逻辑一定有问题。有什么想法吗?

4

0 回答 0