C ++ - servidor simple que envía HTML simple a los clientes
Pregunta
Ahora, sólo estoy jugando con esto y no estoy seguro de por qué esto no 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;
}
Cuando compilar y ejecutar este y vaya a 127.0.0.1 en mi navegador me sale esto en mi consola:
GET / HTTP / 1.1
Host: 127.0.0.1
Conexión: keep-alive
User-Agent: Mozilla / 5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit / 530,5 (K HTML, like 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, imagen / png, / ; q = 0,5
Accept-Encoding: gzip, desinflar, bzip2, SDCH
Accept-Language: en-US, en; q = 0,8
Accept-Charset: ISO-8859-1, UTF-8; q = 0,7, *; q = 0,3
Editar - He actualizado el código HTML que estoy enviando. Acabo de probar esto con Mozilla Firefox y Google Chrome y funciona en Firefox, Chrome, pero no!
EDIT 2 - Así, parece que la razón por la que estaba trabajando en Firefox, pero no cromo, se debía a que Firefox muestra el HTML como su recibido, mientras que Chrome espera para la conexión a cerrar antes de realizar cualquier representación. He añadido el código para cerrar el socket y funcionó. He actualizado mi código con la fuente de trabajo.
Solución
Es necesario enviar de vuelta la línea de estado:
HTTP / 1.1 200 OK
precedente sus cabeceras de respuesta.
Ver Fiddler (www.fiddler2.com) para obtener una mejor idea de lo que las respuestas HTTP adecuada parecen.
En cuanto a su posterior edición, todos los navegadores esperan una cierta cantidad de datos antes de iniciar la prestación; límite de Chrome es diferente a la de Firefox. Si ha configurado un Content-Length o utiliza la codificación HTTP fragmentada, que habría visto un comportamiento adecuado.
Otros consejos
http://code.google.com/p/mongoose/ Es una biblioteca que contiene uno mismo que es un servidor web http multiproceso y tiene una API muy simple (pero completo). A los pocos minutos tuve la oportunidad de unirse a mi aplicación ya existente.
Yo tenía la misma pregunta el día de hoy (para dar mi aplicación C ++ un callejón sin web) Dar aplicación de C ++ una funcionalidad de servidor web HTTP