C中的HTTP代理,recv()不会阻塞?

时间:2013-10-22 23:47:59

标签: c http proxy blocking recv

我试图回溯行为并编写这个最小的代码来说明问题。

我尝试做的是与客户端(浏览器)保持持久连接。这个想法是程序等待客户端请求页面,然后发回静态页面。

int main(){

   // Set-up proxy and wait for 1 user
   int sock;
   proxy_listen(&sock, DEFAULT_PORT, 1);
   printf("Proxy has started..\n");
   puts("Waiting for user to connect..");
   int sock_user = accept(sock, (struct sockaddr*)NULL, NULL);
   printf("User connected.\n");


   while (1){

      // Receive client's request
      char buff[1000];
      int got = recv(sock_user, buff, sizeof(buff), 0); // IT WON'T BLOCK HERE
      printf("Client sent bytes: %d\n", got);


char *resp="\HTTP/1.1 200 OK\r\n\
Content-Length: 68\r\n\
Connection: close\r\n\r\n\
<!DOCTYPE html><html><head></head><body><p>Got it!</p></body></html>\r\n";


      // Send response
      int sent = send(sock_user, resp, strlen(resp), 0);
      printf("Proxy sent bytes: %d\n", sent);

   }
    return 0;
}

输出:

Proxy has started..
Waiting for user to connect..
User connected.
Client sent bytes: 1000
Proxy sent bytes: 145
Client sent bytes: 416
Proxy sent bytes: 145
Client sent bytes: 0
Proxy sent bytes: 145
Client sent bytes: 0

问题是循环不会在recv 上暂停,而是继续打开并最终程序停止。那是为什么?

在响应中将 关闭 设置为 keep-alive 似乎可以解决此问题。我假设服务器端在第一次响应后关闭了连接。如果是这种情况,不应该 recv()给我一个错误?如果我想让它在套接字中没有数据时阻塞,为什么它会返回0?

1 个答案:

答案 0 :(得分:1)

recv()返回一个你完全忽略的值:

  • 0,流结束:关闭套接字并退出读取循环。
  • -1:错误:除非errnoEAGAIN/EWOULDBLOCK,否则连接被关闭:关闭套接字并退出读取循环。