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

C++ C++;-向客户端发送简单HTML的简单服务器,c++,html,http,winsock2,C++,Html,Http,Winsock2,现在,我只是在胡闹,我不知道为什么这不起作用 #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

现在,我只是在胡闹,我不知道为什么这不起作用

#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;
}
#包括
#包括
#包括
#包括
const char html[]=“HTTP/1.1 200正常\r\n”
“连接:关闭\r\n”
“内容类型:text/html\r\n”
“\r\n”
“\r\n”
“\r\n”
你好,世界!\r\n
“\r\n”
“\r\n”
你好,世界!\r\n
“\r\n”
“\r\n\r\n”;
int main(){
WSADATA wsa;
断言(WSAStartup(MAKEWORD(2,2),&wsa)==0);
addrinfo*res=NULL;
addrinfo提示;
零内存(&提示,sizeof(提示));
hits.ai_family=AF_INET;
hits.ai_socktype=SOCK_流;
hits.ai_protocol=IPPROTO_TCP;
hits.ai_flags=ai_被动;
断言(getaddrinfo(NULL,“80”、&hints、&res)==0);
sockets=SOCKET(res->ai_系列,res->ai_socktype,res->ai_协议);
断言(s!=无效的_套接字);
断言(绑定(s,res->ai_addr,(int)res->ai_addrlen)!=套接字错误);
断言(侦听(s,SOMAXCONN)!=SOCKET\u错误);
套接字客户端=接受(s,NULL,NULL);
断言(客户端!=无效的_套接字);
字符缓冲区[512];
整数字节;
字节=recv(客户端,缓冲区,512,0);
对于(int i=0;i
当我编译并运行它,然后在我的浏览器中导航到127.0.0.1时,我在控制台中得到:

GET/HTTP/1.1

主持人:127.0.0.1

连接:保持活力

用户代理:Mozilla/5.0(Windows;U;Windows NT 5.1;en-US)AppleWebKit/530.5(K HTML,类似Gecko)Chrome/2.0.172.8 Safari/530.5

缓存控制:最大年龄=0

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

接受编码:gzip、deflate、bzip2、sdch

接受语言:en-US,en;q=0.8

接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3

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


编辑2-看来它在Firefox上工作,而不是在Chrome上工作,是因为Firefox将HTML显示为其接收的HTML,而Chrome则在进行任何渲染之前等待连接关闭。我添加了关闭套接字的代码,它工作了。我已使用工作源代码更新了我的代码。

您需要d返回状态行:

HTTP/1.1200ok

在响应标题之前

请参阅Fiddler(www.fiddler2.com),以更好地了解正确的HTTP响应

关于您以后的编辑,所有浏览器在开始渲染之前都会等待一定量的数据;Chrome的限制不同于Firefox。如果您设置了内容长度或使用HTTP分块编码,您会看到正确的行为。

看看Mongoose 它是一个自包含的库,是一个多线程http web服务器,有一个超级简单的api(但仍然完整)。几分钟之内,我就能够将它绑定到我已经存在的应用程序


我今天早些时候有同样的问题(给C++应用程序一个Web端)

谢谢你的建议,我现在正在检查它(即使我只是在胡闹,这看起来很有趣!)+ 1的猫鼬。请看我的原始问题,由“未知”指向你的帖子: