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

时间:2009-05-17 05:47:54

标签: 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"
"\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

     

主持人:127.0.0.1

     

连接:保持活力

     

User-Agent: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

     

缓存控制:max-age = 0

     

接受: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

     

接受语言: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!

编辑2 - 所以看起来它在Firefox上运行的原因,而不是Chrome,是因为Firefox显示HTML已收到,而Chrome等待连接关闭之前渲染。我添加了代码来关闭套接字,它工作。我已经使用工作源更新了我的代码。

2 个答案:

答案 0 :(得分:4)

看看猫鼬http://code.google.com/p/mongoose/ 它是一个独立的库,是一个多线程的http Web服务器,具有超级简单的api(尚未完成)。几分钟后,我就可以将它绑定到我现有的应用程序。

我今天早些时候遇到了同样的问题(为了给我的C ++应用程序提供网络结束)Giving C++ Application a HTTP Web Server Functionality

答案 1 :(得分:3)

您需要发回状态行:

HTTP / 1.1 200确定

在您的回复标题之前。

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

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