gpt4 book ai didi

C++ - 向客户端发送简单 HTML 的简单服务器

转载 作者:太空宇宙 更新时间:2023-11-04 15:28:55 28 4
gpt4 key购买 nike

现在,我只是在胡闹,我不确定为什么它不起作用。

#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#include <cassert>

const char html[] = "HTTP/1.1 200 OK\r\n"
"Connection: close\r\n"
"Content-type: text/html\r\n"
"\r\n"
"<html>\r\n"
"<head>\r\n"
"<title>Hello, world!</title>\r\n"
"</head>\r\n"
"<body>\r\n"
"<h1>Hello, world!</h1>\r\n"
"</body>\r\n"
"</html>\r\n\r\n";

int main() {
WSADATA wsa;

assert( WSAStartup( MAKEWORD( 2, 2 ), &wsa ) == 0 );

addrinfo *res = NULL;
addrinfo hints;

ZeroMemory( &hints, sizeof( hints ) );

hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;

assert( getaddrinfo( NULL, "80", &hints, &res ) == 0 );

SOCKET s = socket( res->ai_family, res->ai_socktype, res->ai_protocol );

assert( s != INVALID_SOCKET );
assert( bind( s, res->ai_addr, (int)res->ai_addrlen ) != SOCKET_ERROR );
assert( listen( s, SOMAXCONN ) != SOCKET_ERROR );

SOCKET client = accept( s, NULL, NULL );

assert( client != INVALID_SOCKET );

char buffer[512];
int bytes;

bytes = recv( client, buffer, 512, 0 );

for ( int i = 0; i < bytes; ++i ) {
std::cout << buffer[i];
}

assert( send( client, html, strlen( html ) - 1, 0 ) > 0 );
assert( shutdown( client, SD_BOTH ) != SOCKET_ERROR );

closesocket( client );
WSACleanup();

return 0;
}

当我编译并运行它然后在我的浏览器中导航到 127.0.0.1 时,我在我的控制台中得到了这个:

GET / HTTP/1.1

Host: 127.0.0.1

Connection: keep-alive

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (K HTML, like Gecko) Chrome/2.0.172.8 Safari/530.5

Cache-Control: max-age=0

Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,/;q=0.5

Accept-Encoding: gzip,deflate,bzip2,sdch

Accept-Language: en-US,en;q=0.8

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

编辑 - 我更新了发送的 HTML。我刚刚使用 Mozilla Firefox 和 Google Chrome 对此进行了测试,它可以在 Firefox 中运行,但不能在 Chrome 中运行!

EDIT 2 - 所以它在 Firefox 而不是 Chrome 上工作的原因似乎是因为 Firefox 显示收到的 HTML,而 Chrome 在执行任何操作之前等待连接关闭渲染。我添加了关闭套接字的代码并且它起作用了。我已经使用工作源更新了我的代码。

最佳答案

您需要发回状态行:

HTTP/1.1 200 正常

在您的响应 header 之前。

请参阅 Fiddler (www.fiddler2.com) 以更好地了解正确的 HTTP 响应是什么样的。

关于你后面的编辑,所有浏览器在开始渲染之前都会等待一定数量的数据; Chrome 的限制与 Firefox 的不同。如果您设置了 Content-Length 或使用了 HTTP Chunked 编码,您就会看到正确的行为。

关于C++ - 向客户端发送简单 HTML 的简单服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/873978/

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