代码之家  ›  专栏  ›  技术社区  ›  xian

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

  •  0
  • xian  · 技术社区  · 15 年前

    现在,我只是在玩弄这个,我不知道为什么这个不起作用。

    #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时,我会在控制台中得到它:

    获取/ 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 -因此,它在火狐上工作而不是Chrome的原因似乎是因为火狐将HTML显示为接收到的HTML,而Chrome在进行渲染之前等待连接关闭。我添加了关闭套接字的代码,它运行正常。我已经用工作源更新了我的代码。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Eric Lawrence    15 年前

    您需要返回状态行:

    HTTP/1.1 200 OK

    在您的响应头之前。

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

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

        2
  •  4
  •   Community Sam Holder    7 年前

    看看猫鼬 http://code.google.com/p/mongoose/ 它是一个独立的库,它是一个多线程HTTP Web服务器,拥有一个超级简单的API(还很完整)。几分钟之内,我就可以将它绑定到我已经存在的应用程序上。

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