Domanda

Ora, io sono solo scherzare con questo e non sono sicuro del perché questo non sta funzionando.

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

Quando compilo e corro questo e quindi passare a 127.0.0.1 nel mio browser ottengo questo nella mia console:

  

GET / HTTP / 1.1

     

Host: 127.0.0.1

     

Connessione: keep-alive

     

User-Agent: Mozilla / 5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit / 530,5 (K HTML, come Gecko) Chrome / Safari 2.0.172.8 / 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, sgonfiare, bzip2, SDCH

     

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

     

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

Modifica - Ho aggiornato il codice HTML sto inviando. Ho appena provato questo con Mozilla Firefox e Google Chrome e funziona in Firefox, ma non Chrome!

Modifica 2 - Così sembra che la ragione per cui stava lavorando su Firefox, ma non Chrome, è stato perché Firefox visualizza l'HTML come relativo ricevuto, mentre Chrome attende la connessione di chiudere prima di fare qualsiasi il rendering. Ho aggiunto il codice per chiudere la presa e ha funzionato. Ho aggiornato il mio codice con la fonte di lavoro.

È stato utile?

Soluzione

È necessario inviare di nuovo la riga di stato:

HTTP / 1.1 200 OK

che precede le intestazioni di risposta.

Vedere Fiddler (www.fiddler2.com) per ottenere una migliore idea di quello che le risposte HTTP corretta assomigliano.

Per quanto riguarda la modifica in seguito, tutti i browser attesa di una certa quantità di dati prima di iniziare il rendering; limite di Chrome è diversa da quella di Firefox. Se tu avessi impostato un Content-Length o usato codifica HTTP Chunked, avreste visto un comportamento corretto.

Altri suggerimenti

Guarda Mongoose http://code.google.com/p/mongoose/ Si tratta di una libreria contenuta sé che è un server Web HTTP multithread e ha un super semplice API (ancora completo). In pochi minuti sono stato in grado di legarsi al mio app già esistenti.

Ho avuto la stessa domanda prima di oggi (per dare la mia applicazione C ++ un vicolo web) Dare Applicazione C ++ una funzionalità Web HTTP Server

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top