Question

Maintenant, je suis juste rigoler avec cela et je ne suis pas sûr de savoir pourquoi cela ne fonctionne pas.

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

Quand je compile et exécute ceci et puis accédez à 127.0.0.1 dans mon navigateur je reçois dans ma console:

  

GET / HTTP / 1.1

     

Hôte: 127.0.0.1

     

Connexion: keep-alive

     

User-Agent: Mozilla / 5.0 (Windows; U; Windows NT 5.1, en-US) AppleWebKit / 530,5 (K HTML, comme 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, l'image / jpeg, / ; q = 0,5

     

Accept-Encoding: gzip, dégonfler, bzip2, sdch

     

Accept-Language: fr-fr, fr; q = 0,8

     

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

EDIT - Je l'ai mis à jour le code HTML que je vous envoie. Je viens de tester cela avec Mozilla Firefox et Google Chrome et il fonctionne dans Firefox, mais pas Chrome!

EDIT 2 - Il semble donc que la raison pour laquelle il travaillait sur Firefox, mais pas Chrome, est parce que Firefox affiche le code HTML comme reçu, tandis que Chrome attend la connexion à fermer avant de faire une le rendu. J'ai ajouté le code pour fermer le socket et cela a fonctionné. J'ai mis à jour mon code avec la source de travail.

Était-ce utile?

La solution

Vous devez renvoyer la ligne d'état:

HTTP / 1.1 200 OK

précédant vos en-têtes de réponse.

Voir Fiddler (www.fiddler2.com) pour obtenir une meilleure idée de ce que les réponses HTTP approprié ressemblent.

En ce qui concerne votre édition plus tard, tous les navigateurs attendent une certaine quantité de données avant de commencer le rendu; La limite de Chrome est différent de Firefox de. Si vous avez défini un Content-Length ou utilisé le codage HTTP Chunked, vous auriez vu un comportement correct.

Autres conseils

Regardez Mongoose http://code.google.com/p/mongoose/ Il est une auto bibliothèque contenu qui est un serveur Web multithread http et a une api super simple (complet). En quelques minutes, j'ai pu le lier à mon application déjà existante.

J'ai eu la même question plus tôt aujourd'hui (pour donner mon application C ++ une extrémité de web) Donner application C ++ une fonctionnalité de serveur Web HTTP

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top