Pergunta

Agora, eu só estou brincando com isso e eu não tenho certeza de por que isso não está funcionando.

#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 eu compilar e executar este e navegue para 127.0.0.1 no meu navegador eu recebo isso no meu console:

GET / HTTP / 1.1

Anfitrião: 127.0.0.1

Conexão: keep-alive

User-Agent: Mozilla / 5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit / 530,5 (K HTML, como Gecko) Chrome / 2.0.172.8 Safari / 530,5

Cache-Control: max-age = 0

Aceitar: 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

Aceite-Codificação: ISO 8859-1, utf-8; q = 0,7, *; q = 0,3

Editar - Eu atualizei o HTML Estou enviando. Eu só testei isso com o Mozilla Firefox e Google Chrome e funciona no Firefox, mas não Chrome!

EDIT 2 - Assim, parece que a razão pela qual estava trabalhando no Firefox, mas não Chrome, foi porque Firefox exibe o HTML como seu recebido, enquanto aguarda Chrome para ligação de perto antes de fazer qualquer Renderização. Eu adicionei o código para fechar o soquete e funcionou. Eu atualizei meu código com a fonte trabalhando.

Foi útil?

Solução

Você precisa enviar de volta a linha de status:

HTTP / 1.1 200 OK

precedente seus cabeçalhos de resposta.

Veja Fiddler (www.fiddler2.com) para ter uma melhor idéia do que respostas HTTP adequada parecer.

No que diz respeito a sua edição mais tarde, todos os navegadores esperar por uma certa quantidade de dados antes de iniciar a prestação; limite do Chrome é diferente do Firefox, da. Se você havia estabelecido um Content-Length ou usado HTTP Chunked codificação, você teria visto um comportamento adequado.

Outras dicas

Olhe para Mongoose http://code.google.com/p/mongoose/ É uma auto-contido biblioteca que é um servidor web http multithreaded e tem uma API simples super (mas completa). Dentro de alguns minutos, eu era capaz de vinculá-lo ao meu aplicativo já existente.

Eu tive a mesma pergunta hoje cedo (para dar o meu C ++ aplicação a fim web) dar aplicação C ++ a Funcionalidade do Servidor HTTP web

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top