Frage

Nun, ich täusche nur mit diesem um, und ich bin mir nicht sicher, warum dies nicht funktioniert.

#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;
}

Als ich das kompilieren und ausführen und dann navigieren in meinem Browser 127.0.0.1 bekomme ich diese in meiner Konsole:

  

GET / HTTP / 1.1

     

Host: 127.0.0.1

     

Verbindung: Keep-Alive

     

User-Agent: Mozilla / 5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit / 530,5 (K HTML, wie Gecko) Chrom / 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

Bearbeiten - Ich habe die HTML aktualisiert Ich schicke. Getestet habe ich nur das mit Mozilla Firefox und Google Chrome und es funktioniert in Firefox, aber nicht Chrome!

EDIT 2 - So scheint es, dass der Grund, es wurde auf Firefox zu arbeiten, aber nicht Chrome, war, weil Firefox die HTML als empfangene zeigt, während Chrome wartet auf die Verbindung, bevor zu schließen jede tun Rendering. Ich habe den Code, um die Steckdose zu schließen und es funktionierte. Ich habe meinen Code mit der Arbeitsquelle aktualisiert.

War es hilfreich?

Lösung

Sie müssen die Statuszeile zurück senden:

HTTP / 1.1 200 OK

vor Ihrem Antwort-Header.

Siehe Fiddler (www.fiddler2.com) eine bessere Vorstellung davon zu bekommen, was die richtigen HTTP-Antworten aussehen.

In Bezug auf Ihre später bearbeiten, alle Browser warten auf eine bestimmte Menge an Daten vor dem Start machen; Chrome-Grenze ist anders als Firefox. Wenn Sie ein Content-Length oder gebrauchte HTTP Chunked Kodierung gesetzt hätte, hätte man das richtige Verhalten gesehen.

Andere Tipps

Schauen Sie sich Mungo http://code.google.com/p/mongoose/ Es ist eine in sich geschlossene Bibliothek, die eine Multi-Thread-HTTP-Webserver ist und hat eine super einfache api (noch vollständig). Innerhalb von wenigen Minuten konnte ich es auf meine bereits bestehenden App binden.

Ich hatte die gleiche Frage heute früher Geben C ++ Anwendung eine HTTP-Web-Server-Funktionalität

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top