2010-11-04 7 views
5

Cuando digo bibliotecas no estándar, me refiero a cosas como Boost, libCurl y cualquier otra cosa que pueda hacer esto mucho más fácil que el estándar C++ puede La razón para esto es que estoy escribiendo una aplicación como parte del trabajo del curso (la clase está dedicada a C++) y estoy obligado a usar solo bibliotecas y funciones estándar.Descargar un archivo de la web en C++ sin usar bibliotecas no estándar en Linux

Estoy buscando descargar un archivo RSS, usando una URL que el usuario proporcionará (estoy construyendo un cliente RSS rudimentario), y el mayor problema que estoy enfrentando es que no estoy seguro de cómo conseguirlo el archivo abajo Una vez que supere ese bit, analizarlo para las etiquetas xml y mostrar el contenido será relativamente sencillo. He estado mirando alrededor y solo he encontrado soluciones que dicen usar bibliotecas no estándar, generalmente libCurl. Si alguien pudiera darme una breve advertencia sobre lo que debería estar buscando para esto, entonces estaría agradecido.

Además, si crees que me estás ayudando a hacer trampa, no es así. La tarea es construir una aplicación de nuestra elección y estamos siendo calificados en nuestro uso de las diversas características del lenguaje (debe contener tantas clases, usar estos tipos de variables, etc.).

+0

¿Cuál es la pregunta real? ¿Quieres que alguien te escriba una aplicación para hacer esto? ¿Has escrito el tuyo y estás teniendo problemas con él? –

+0

@jon hanson Estoy buscando a alguien que me señale en la dirección correcta, y he actualizado la pregunta para reflejar esto. –

+2

"Una vez que supere ese bit, analizarlo para las etiquetas xml y mostrar el contenido será relativamente sencillo". - buena suerte con eso. – JeremyP

Respuesta

8

Salida Beej's Guide to Network Programming para una introducción rápida pero excelente para tomas. Si no puede usar ninguna biblioteca no estándar, su única opción es conectarse manualmente en el puerto 80 y realizar la solicitud usted mismo.

Asumiendo que incluso un conocimiento de nivel principiante de C++, debería ser todo lo que necesita.

2

Si realmente quiere hacerlo sin utilizar libcurl siempre se puede abrir un socket TCP y luego enviar:

GET /myurl 

(http 1.0 o preferiblemente utilizar http 1.1)

Básicamente estás escribiendo una implementación de cliente de protocolo http muy simple.

+0

libcurl definitivamente cae bajo la categoría "biblioteca estándar". –

+0

@hassan Estoy de acuerdo, pero la pregunta específicamente para "no usar libcurl", que deja pocas opciones – Flexo

+0

de hecho, acabo de ver eso. Es extraño que cualquier profesor universitario llevara a su clase a suponer que libcurl se considera no estándar. De todos modos, la siguiente mejor respuesta para el OP es "leer" el código fuente curl. –

0

Puede descargar el código fuente para wget utilidad estándar

0

Dado que no está permitido el uso de bibliotecas no estándar, podría escribir su propia clase de envoltura primitiva para el comando "curl" de linux (supongo que está usando linux). Curl es un comando muy poderoso, y probablemente puede hacer lo que usted necesita.

9

En primer lugar, no se puede hacer utilizando solo C++ estándar. No hay interfaz de red ni en C++ estándar ni en C estándar.

Si se le exige que adopte un enfoque de "hágalo usted mismo", es probable que la intención sea utilizar la API de sus sockets de plataforma. En el caso de Linux, esto es parte del estándar POSIX, no de C++, y está disponible en <sys/socket.h>.

El procedimiento básico es: analizar la URL; buscar la dirección IP del dominio; crear un socket; conecta el zócalo; escribir una solicitud HTTP al socket; lea la respuesta HTTP desde el socket; limpiar.

Obviamente, una biblioteca HTTP es mucho más conveniente, especialmente porque una descarga HTTP puede ser más complicada de lo que describo anteriormente (por ejemplo, si el servidor responde con un redireccionamiento). Casi todas las distribuciones de Linux proporcionarán libcurl, y/o los programas curl y wget.

+0

+1 para señalar que no es C++ – Flexo

+1

+1 para señalar que no hay interfaz de red en la biblioteca estándar de C++ (o C). –

3

Escribir un programa para hacer una conexión de socket es relativamente trivial.

http://www.linuxhowtos.org/C_C++/socket.htm

Ahora que tiene una toma abierta a un servidor HTTP es necesario entender cómo pedir un documento y cómo decodificar la respuesta:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html

Básicamente usted necesita enviar:

GET<SP><URL><SP>HTTP/1.1<CRLF> 

Where: 
    SP: Single Space 
    CRLF: \r\n 
    URL: The Full URL of the page including the server name. 

Lo que se obtiene habrá

http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6

HTTP/1.1<SP>200<SP>OK<CRLF> 
(<Header><CRLF>)* 
<CRLF> 
<Document> 

Los medios anteriores:

  • La primera línea es la línea de la respuesta que debe contener 200 OK.
    • Si no es así, entonces hay algún tipo de error y simplemente debe darse por vencido.
  • Esto es seguido por 0 o más líneas de cabecera
    • Simplemente ignorar estas líneas
  • Habrá 1 línea vacía para marcar el final de las cabeceras.
  • Luego, el documento estará en la transmisión.
+0

"Si no es así, entonces hay algún tipo de error y simplemente debe darse por vencido". - Bueno, hay 3xx. Con una URL proporcionada por el usuario, lo más probable es que resulte necesario seguir los redireccionamientos. –

Cuestiones relacionadas