gpt4 book ai didi

C、HTTP 1.1 和 Socket Send 的麻烦

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

作为我之前在 Creating a web server in pure C 上的帖子的补充, 我在使用发送功能时遇到了一些问题。这是两个代码片段:

int Send(char *message)
{
int length, bytes_sent;
length = strlen(message);

bytes_sent = send(connecting_socket, message, length, 0);

return bytes_sent;
}

此代码将 void * 发送到当前套接字。就像一个魅力!

现在 SendHTML 来了

void SendHTML(char *Status_code, char *Content_Type, char *HTML)
{
char *head = "\r\nHTTP/1.1 ";
char *content_head = "\r\nContent-Type: ";
char *server_head = "\r\nServer: PT06";
char *length_head = "\r\nContent-Length: ";
char *date_head = "\r\nDate: ";
char *newline = "\r\n";
char Content_Length[100];
int content_length = strlen(HTML);

sprintf(Content_Length, "%i", content_length);

char *message = malloc((
strlen(head) +
strlen(content_head) +
strlen(server_head) +
strlen(length_head) +
strlen(date_head) +
strlen(newline) +
strlen(Status_code) +
strlen(Content_Type) +
strlen(Content_Length) +
content_length +
sizeof(char)) * 2);

if ( message != NULL )
{
time_t rawtime;

time ( &rawtime );

strcpy(message, head);

strcat(message, Status_code);

strcat(message, content_head);
strcat(message, Content_Type);
strcat(message, server_head);
strcat(message, length_head);
strcat(message, Content_Length);
strcat(message, date_head);
strcat(message, (char*)ctime(&rawtime));
strcat(message, newline);
strcat(message, HTML);

Send(message);

free(message);
}
}

如果我要添加

Send("Oh end of HTML Sending eh?");

Send(message) 之后和 free(message) 之前,这不是发送到浏览器吗?

我想这可能是一个 HTTP 1.1 问题,RFC 是否说我只能执行一次发送?浏览器是否在收到第一条消息后关闭连接?

我该如何解决这个问题,以便我可以执行以下操作:

SendHTML("200 OK", "text/plain", "HAaaaii!!");
Send("lolwut?");

这应该导致浏览器显示:

HAaaaii!!lolwut?

最佳答案

由于您发送的是内容长度,因此浏览器将不会在“HAaaaii !!”之后不再接受任何内容。因此将解释“lolwut?”作为其下一个请求的答案的一部分,当然会失败。

您可以跳过发送内容长度,但这意味着您没有使用保持事件状态,因此每个 TCP 连接不能处理多个请求。

每个 TCP 连接处理多个请求-响应交换可以大大加快浏览速度,因为一个普通的网页由几个独立的资源组成,每个资源都必须单独请求。由于建立 TCP 连接至少需要 3 次往返,这会为每个资源增加额外的、不必要的延迟。

关于C、HTTP 1.1 和 Socket Send 的麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/431281/

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