2

我正在使用以下代码将一个简单的网页复制到“缓冲区”中。

char sendBuffer[256];
ZeroMemory(sendBuffer, 256);
strcpy(sendBuffer, "HTTP/1.1 403 Forbidden\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE html>\r\n<html>\r\n\t<head>\r\n\t\t<title>403 - Forbidden</title>\r\n\t</head>\r\n\t<body>\r\n\t\t<h1>403 - Forbidden</h1>\r\n\t</body>\r\n</html>");

这适用于 Firefox,但 Chrome 只是崩溃。

我使用 \r\n 作为我被告知要使用的“CRLF”,这是正确的吗?

4

1 回答 1

0

您缺少Content-Length标题。Connection: close如果您包含作为标头以指示连接的关闭将表示内容的结束,则这不是必需的。

const char msg[] =
"HTTP/1.1 403 Forbidden\r\n"
"Connection: close\r\n"
"Content-Type: text/html\r\n"
"\r\n"
"<!DOCTYPE html>\r\n"
"<html>\r\n"
"\t<head>\r\n"
"\t\t<title>403 - Forbidden</title>\r\n"
"\t</head>\r\n"
"\t<body>\r\n"
"\t\t<h1>403 - Forbidden</h1>\r\n"
"\t</body>\r\n</html>"
;

char sendBuffer[256];
snprintf(sendBuffer, sizeof(sendBuffer), "%s", msg);

否则,您将不得不动态或静态地将消息正文长度插入到Content-Length标头中。

const char msg_header[] =
"HTTP/1.1 403 Forbidden\r\n"
"Content-Length: %d\r\n"
"Content-Type: text/html\r\n"
"\r\n"
"%s"
;

const char msg_body[] =
"<!DOCTYPE html>\r\n"
"<html>\r\n"
"\t<head>\r\n"
"\t\t<title>403 - Forbidden</title>\r\n"
"\t</head>\r\n"
"\t<body>\r\n"
"\t\t<h1>403 - Forbidden</h1>\r\n"
"\t</body>\r\n</html>"
;

char sendBuffer[256];
snprintf(sendBuffer, sizeof(sendBuffer), msg_header,
         sizeof(msg_body)-1, msg_body);

Connection: close正如 Eddy_Em 所指出的,如果服务器实际上关闭了连接,则无需声明。如果您的服务器在发出此消息后没有关闭连接,则需要内容长度。

于 2013-06-04T17:51:03.393 回答