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.
Código
# 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; 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) { } 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) { } 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