Discussion:
Invocar página web desde CGI
(demasiado antiguo para responder)
m***@gmail.com
2005-06-10 01:47:53 UTC
Permalink
Hola:

Alguien sabe como es posible llamar desde un CGI una página Web y
luego analizar el resultado para desplegar un mensaje de OK o FALLO,
según el resultado obtenido como salida del HTML.

Thanks

Master Soccer
Oscar Garcia
2005-06-10 06:23:50 UTC
Permalink
Post by m***@gmail.com
Alguien sabe como es posible llamar desde un CGI una página Web y
luego analizar el resultado para desplegar un mensaje de OK o FALLO,
según el resultado obtenido como salida del HTML.
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

typedef struct {
char *datos;
size_t n_datos;
} str_datos;

#define TAM 2048

int conectar(char *host, ushort puerto, char *archivo, str_datos
*buffer) {
char *datos, enviar[2048];
char *p;
size_t reciv;
struct hostent *str_he;
struct sockaddr_in serv;
int socket;

address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;

// Resolvemos el host de destino.
if ((he = gethostbyname(host)) == NULL) {
fprintf(stderr, "Error resolviendo %s\n", host);
return 1;
}

// Configuramos el puerto de destino
memcpy(&serv.sin_addr, he->h_addr_list[0], he->h_length);
serv.sin_family = AF_INET;
serv.sin_port = htons(puerto);

// Conectamos al host remoto
if (connect(socket, (struct sockaddr *)&serv, sizeof(serv)) {
fprintf(stderr, "Error conectando a %s..", host);
return 2;
}

// Enviamos (si tenemos espacio de memoria suficiente)
// la petición HTTP para recibir el archivo que deseamos
if ((strlen(host) + strlen(archivo)) > 2000)
return 3;
sprintf(enviar, "GET %d HTTP/1.1\nHost: %d\n\n",
archivo, host);
send(socket, enviar, str_len(enviar), 0);

// Mientras queden datos por obtener lo metemos en un buffer.
// Notar que al no usar conexiones persistentes el servidor cerrará
// la conexión tras terminar de enviar el archivo
// (recv devolverá 0).
buffer->n_datos 0;
buffer->datos = p = malloc(TAM);
while (reciv = recv(socket, p, TAM) {
buffer->n_datos += reciv;
buffer->datos = realloc(buffer->datos, buffer->ndatos + TAM);
p += buffer->datos + buffer->n_datos;
}

return 0;
}

Está programado sin probarlo, pero al menos espero que pilles la idea.

Luego con tu función puedes hacer lo que te venga mejor con los datos.
Post by m***@gmail.com
Thanks
De nada.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Loading...