[C] HTTP-PROXY

Iniciado por D4RIO, 1 Marzo 2011, 00:03 AM

0 Miembros y 1 Visitante están viendo este tema.

D4RIO

Hola gente, hace tiempo que no posteo. Un amigo estaba viendo cómo hacer un proxy http y me pasó un draft para que le eche un vistazo.

La verdad es que hace rato que no veo nada de sockets, y menos de HTTP. Quizá cuando tenga un rato le eche un vistazo capturando paquetes para ver si trabaja como debe, mientras tanto se los dejo para que me den opiniones / mejoras / comentarios, y jueguen un rato capturando paquetes.

# include <stdio.h>
# include <sys/types.h>
# include <sys/socket.h>
# include <sys/time.h>
# include <sys/param.h>
# include <sys/file.h>
# include <netinet/in.h>
# include <netdb.h>
# include <ctype.h>
# include <string.h>
# include <stdlib.h>
# include <errno.h>
# include <limits.h>
# define ERR 5;
# define DATA 3;
# define ACK 4;
# define BLOQUE 516;
# define DIR_SERVIDOR 100;
FILE *archivo;
FILE *archivo2; //20
char no_arch[20];
char nom_arch[20];
char error[1024];
char resp[1024];
char data[516];
char data2[516];
char ack[1024];
char Met[5]= "post\0";
uint16_t error_tipo, ack_tipo, cod, tipo;
int socketserv, nro_frag, cant, n, socketcli, posi;
struct sockaddr_in extremoRemoto;
struct sockaddr_in enlace;
char buffer[512];
char recibido[512];


void codigoError()
// Establece el codigo de error que voy a mandar en el paquete ERR al cliente
{
switch (errno)
{
case 2: cod-1; break;
case 5: cod-2; break;
}
}
int timeout(int fd, int sec)
/*Controla el timeout. Devuelve 0 si se termino el timeout, -1 en caso de
error y un valor positivo si hay un evento pendiente*/
{
fd_set conj_lectura;
struct timeval tiempo;
int r;
FD_ZERO(&conj_lectura);
FD_SET(fd, &conj_lectura);
tiempo.tv_sec=sec;
tiempo.tv_usec=0;
r=select(FD_SETSIZE, &conj_lectura, NULL,NULL,&tiempo);
}
void metodo()
{// este metodo selecciona post / head.
//Anulado
//Met[1]= "p";
//Met[2]= "o";
//Met[3]= "s";
//Met[4]= "t";
//Met[5]= "\0";
}
void busca_archivo(int j)
{
int compa;
compa=strncmp(buffer+j," HTTP",5);
if (compa==0)
{
posi=j;
}
else
{
j++;
(void)busca_archivo(j);
}
}
int main()
{
int sd,sdc,lon,ar;
struct sockaddr_in ser,cli;
ser.sin_family=AF_INET;
ser.sin_port=htons(80);
ser.sin_addr.s_addr=INADDR_ANY;

char archi[512];
posi=0;
sd=socket(PF_INET,SOCK_STREAM,0);
if (bind(sd,(struct sockaddr *) &ser,sizeof(ser)) < 0)
{
perror("Error en Bind: ");
exit(-1);
}
listen(sd,5);
while (1)
{
lon=sizeof(cli);
sdc= accept(sd,(struct sockaddr *) &cli, &lon);
ar=recv(sdc,buffer,sizeof(buffer),0);
(void)busca_archivo(1);
int sock_serv,con,env,rcv,envbro;
struct sockaddr_in server;
server.sin_family=AF_INET;
server.sin_port=htons(80);
server.sin_addr.s_addr=DIR_SERVIDOR;
sock_serv=socket(PF_INET,SOCK_STREAM,0);
con=connect(sock_serv,(struct sockaddr *)&server,sizeof(server));
if (con!=0)
{
perror("Error en Conectar con el Servidor: ");
}
else
{
env=send(sock_serv,buffer,sizeof(sock_serv),0);
rcv=recv(sock_serv,recibido,sizeof(recibido),0);
if (rcv>=0)
{
envbro=send(sdc,recibido,rcv,0);
}
}
close(sock_serv);
close(sdc);
}
close(sd);
}


Saludos,
Happy Hacking
OpenBSDFreeBSD