C代理服务器丢弃请求

C代理服务器丢弃请求,c,sockets,http,proxy,httprequest,C,Sockets,Http,Proxy,Httprequest,我有一个小小的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 r

我有一个小小的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){
//正在等待用户连接
int sock_user=accept(sock,(struct sockaddr*)NULL,NULL);
int sock_host=-1;
//一次接受一个请求并响应
而(1){
http_请求请求;
http_响应响应;
//1.客户端==>代理服务器
http_parse_请求(sock_用户,&req);//使用recv(sock_用户)
//2.客户端代理==>服务器
if(sock_主机<0)
sock\u host=代理连接主机(请求主机);
写入(sock_主机、req.h_数据、req.h_大小);

//3.客户端代理为什么不使用现有的代理,比如-可能带有-或者HTTP服务器库,比如?为哪个操作系统编写代码?浏览器通常会在同一个操作系统上发送多个请求,并且可能会有多个连接。可靠地实现非常复杂…这是任务的一部分,所以我必须这么做这是一个很好的学习方法。哦,这是Linux。我知道它很复杂,但我的例子很简单。它只是用来处理GET请求,而不是别的。然后阅读更多关于HTTP协议的内容。
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);
   }

}