[英]When should I close the socket, if the request contains Connection: keep-alive?
當我使用這個 Python 腳本向我的服務器發送請求時:
import requests as r
url = "http://localhost:8070/"
response = r.get(url=url)
它發送以下請求:
GET / HTTP/1.1
Host: localhost:8070
User-Agent: python-requests/2.27.1
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
如果我理解正確的話, Connection: keep-alive
意味着我不應該關閉客戶端套接字,因為客戶端可以再次使用它。
但是如果我不關閉客戶端套接字,Python 腳本就會卡住,直到我關閉套接字。 是否有另一種方法表明請求已完成以便 pythons 請求理解它?
如果我嘗試將請求發送到任何其他服務器,腳本幾乎會立即完成。 我的猜測是在幾毫秒后使客戶端超時,例如使用 select,如下所示:
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 1000;
select_ret = select(this->_maxfds + 1, &this->_readfds, &this->_writefds, NULL, &timeout);
現在我將在 select 返回 0 后關閉客戶端套接字:
if (select_ret == 0) {
close(client_socket);
}
這是一種有效的方法,還是我遺漏了什么?
我正在發送這樣的回復:
char *response = "HTTP/1.1 200 Ok\r\n\r\n";
send(this->_client_socket, response, strlen(response), 0)
但這不會終止 python 腳本。 執行這行代碼后,python 腳本仍然掛起。 只有當我關閉我這邊的插座時它才會結束。
那么我如何確定是否應該關閉它呢? 正如我已經說過的,我的方法是在沒有數據從客戶端寫入套接字的情況下使用超時。
您對請求中Connection: keep-alive
的理解是正確的。 但是,您的響應中沒有Content-Length
或Transfer-Encoding: chunked
chunked header ,因此客戶端必須知道響應何時完成的唯一方法是等待服務器端關閉套接字連接。 閱讀 HTTP 1.1 協議規范的RFC 2616 第 4.4 節和RFC 7230 第 3.3.3節中概述的規則。
嘗試更像這樣的東西:
const char *response = "HTTP/1.1 200 Ok\r\nContent-Length: 0\r\n\r\n";
send(this->_client_socket, response, strlen(response), 0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.