gpt4 book ai didi

c - C 中的 HTTP GET 服务器,长时间等待 (TTFB)

转载 作者:可可西里 更新时间:2023-11-01 17:00:24 25 4
gpt4 key购买 nike

我正在尝试构建一些 http 服务器。我的程序很简单:我收到 http 请求,等待它结束,然后发送我的响应。不幸的是,在接收浏览器 header 和从 recv 接收空缓冲区以检测到结束之间有几秒钟的间隔,现在我可以发送响应了。

socklen_t clientAddressLength;
int clientSocket = accept(socket, (struct sockaddr *)&socketAddress, &clientAddressLength);
if (clientSocket < 0) {ESP_LOGI(TAG, "failed 3!"); goto network_task_finish;}

if (setsockopt(clientSocket, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)) < 0)
ESP_LOGI(TAG, "Cannot Set SO_SNDTIMEO for socket");
if (setsockopt(clientSocket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0)
ESP_LOGI(TAG, "Cannot Set SO_RCVTIMEO for socket");
while (1) {
ret = recv(clientSocket, recv_buf, NETWORK_RECV_BUF_LEN - 1, 0);
if (ret <= 0) break;
if (ret <= 2 && *recv_buf == '\r') break;
if (ret < NETWORK_RECV_BUF_LEN)
recv_buf[ret] = '\0';
ESP_LOGI(TAG, "RECV");
if (strstr(recv_buf," HTTP/")) {
char *ptr = recv_buf;
if (strncmp(recv_buf, "GET ", 4) == 0)
ptr += 4;
else if (strncmp(recv_buf, "POST ", 4) == 0)
ptr += 5;
else
continue;
ESP_LOGI(TAG, "HEADER!");
}
}

ESP_LOGI(TAG, "RESPONSE");
send(clientSocket, "HTTP/1.1 200 OK\r\n", 17, 0);
send(clientSocket, "Content-Type: text/html\r\n", 25, 0);
send(clientSocket, "Connection: close\r\n", 19, 0);
send(clientSocket, "\r\n", 2, 0);
send(clientSocket, "WORKS", 5, 0);
ESP_LOGI(TAG, "SEND");

日志:

server: RECV
server: HEADER!
... long time ...
server: RESPONSE
server: SEND

处理请求的准确方法是什么?也许我不必等待它的结束或者我可以通过其他方式检测标题结束

最佳答案

问题似乎不是您不知道请求如何结束(只有一个空行),而是您如何检查它。

您必须记住,HTTP 是建立在 TCP 之上的,而 TCP 是一种协议(protocol),没有消息边界或固定大小的数据包。

这意味着您可以在一次或两次、三次或更多次 recv 调用中获取整个请求。如果单个 recv 调用给您只是空行而没有其他任何内容,您只会检测到 header 的结尾,这是不太可能发生的事件。这也可能会给您一个请求结束,因为换行符可能在 header 的中间。

相反,我建议您重新设计接收代码以在循环中调用 recv 并追加到缓冲区。然后在循环中检查最后的 四个 字节是否是双换行符序列 (\r\n\r\n)。如果是,那么您已经找到请求的结尾并且可以打破循环并继续处理请求并实际检查需要什么(GET POST 等)。

关于c - C 中的 HTTP GET 服务器,长时间等待 (TTFB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41222696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com