簡體   English   中英

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

[英]HTTP proxy in C, recv() doesn't block?

我試圖追溯行為,並編寫了此最少的代碼來說明問題。

我試圖做的是無限期地與客戶端( 瀏覽器 )建立持久連接。 這個想法是程序等待客戶端請求頁面,然后將靜態頁面發送回去。

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暫停,而是繼續進行下去,最終程序停止。 這是為什么?

在響應中設置接近於 保持活動似乎可以解決此問題。 我認為服務器端在第一個響應后已經關閉了連接。 如果是這種情況, recv()是否應該給我一個錯誤? 如果套接字中的數據為零,為什么要阻止它,為什么它會返回0?

recv()返回一個您完全忽略的值:

  • 0,流結束:關閉套接字並退出讀取循環。
  • -1:錯誤:除非errnoEAGAIN/EWOULDBLOCK ,否則連接已完成:關閉套接字並退出讀取循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM