C ++ - простой сервер, который отправляет простой HTML клиентам - PullRequest
0 голосов
/ 17 мая 2009

Теперь я просто дурачусь с этим, и я не уверен, почему это не работает.

#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 в моем браузере, я получаю это в моей консоли:

GET / HTTP / 1.1

Хост: 127.0.0.1

Соединение: keep-alive

Пользователь-агент: Mozilla / 5.0 (Windows; U; Windows NT 5.1; ru-ru) AppleWebKit / 530,5 (K HTML, как Gecko) Chrome / 2.0.172.8 Safari / 530,5

Cache-Control: max-age = 0

Примите: application / xml, application / xhtml + xml, text / html; q = 0,9, текст / обычный текст; 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

РЕДАКТИРОВАТЬ - Я обновил HTML-код, который я отправляю. Я только что проверил это с Mozilla Firefox и Google Chrome, и он работает в Firefox, но не в Chrome!

EDIT 2 - Похоже, что причина, по которой он работал на Firefox, но не на Chrome, заключалась в том, что Firefox отображает HTML как его полученный, в то время как Chrome ждет закрытия соединения перед выполнением какого-либо рендеринга , Я добавил код, чтобы закрыть сокет, и он работал. Я обновил свой код с рабочим источником.

Ответы [ 2 ]

4 голосов
/ 17 мая 2009

Посмотрите на Мангуста http://code.google.com/p/mongoose/ Это автономная библиотека, которая представляет собой многопоточный веб-сервер http и имеет очень простой API (еще полный). Через несколько минут я смог привязать его к уже существующему приложению.

У меня был тот же вопрос ранее сегодня (чтобы дать моему приложению C ++ веб-интерфейс) Предоставление приложению C ++ функциональности веб-сервера HTTP

3 голосов
/ 17 мая 2009

Вам необходимо отправить обратно строку состояния:

HTTP / 1.1 200 OK

предшествующих вашим заголовкам ответа.

См. Fiddler (www.fiddler2.com), чтобы лучше понять, как выглядят правильные ответы HTTP.

Что касается вашего последующего редактирования, все браузеры ждут определенный объем данных перед началом рендеринга; Ограничение Chrome отличается от ограничения Firefox. Если бы вы установили Content-Length или использовали кодировку HTTP Chunked, вы бы увидели правильное поведение.

...