hefize
Registrado: 03 Dic 2006 Mensajes: 7
| Publicado: 13/12/2006 10:31 am | | | Título: cliente sockets |
| hola: estoy empezando con ha hacer un cliente y un servidor con sockets y con hebras, de momento quiero probar la primera opcion que es el poner un archivo en el servidor y me da error en la linea 111,de implicit declaration of funcion(Enviar fichero) y no se porque puede ser, adjunto el cliente: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <netdb.h> #include <sys/param.h> #include <sys/socket.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/wait.h> #include <signal.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <pthread.h> #include "tcp.h"
int LeerOrden(UDP_Msg m); int Abrir_Socket (int puerto_revidor); int Enviar_Fichero(int sock,int fichero,UDP_Msg m); int Recibir_Fichero(int sock,int fich,UDP_Msg *m);
int main(int argc,char* argv[]) { UDP_Msg mensaje; /* Mensaje a trasmitir/recibir */ char t[20]; struct sockaddr_in dir_udp_cli, /* Direccion cliente */ dir_udp_srv; /* Direccion servidor */ int sock_udp; /* Socket (de tipo UDP) de trasmision de ordenes */ int socket_datos; /* Socket (TCP) pata trasmision de datos */ int fich; /* Descriptor del fichero a trasmitir */ socklen_t tam_dir; /* Tama~no de la direcion del servidor */ int opcion; /* Creacion del socket UDP */ fprintf(stdout,"Creacion del socket UDP: "); sock_udp=socket(AF_INET,SOCK_DGRAM,0); if(sock_udp<0) { fprintf(stdout,"ERROR\n"); exit(1); } fprintf(stdout,"OK\n");
/* Asignacion de la direccion local (del cliente) */ bzero((char*)&dir_udp_cli,sizeof(struct sockaddr_in)); /* Pone a 0 la estructura */ dir_udp_cli.sin_family=AF_INET; dir_udp_cli.sin_addr.s_addr=inet_addr(HOST_CLIENTE); dir_udp_cli.sin_port=htons(PUERTO_UDP_CLIENTE); fprintf(stdout,"Asignacion del puerto cliente: "); if(bind(sock_udp, (struct sockaddr*)&dir_udp_cli, sizeof(struct sockaddr_in))<0) { fprintf(stdout,"ERROR\n"); close(sock_udp); exit(1); } fprintf(stdout,"OK\n");
/* Definicion de la direccion del servidor */ bzero((char*)&dir_udp_srv,sizeof(struct sockaddr_in)); /* Pone a 0 la estructura */ dir_udp_srv.sin_family=AF_INET; dir_udp_srv.sin_addr.s_addr=inet_addr(HOST_SERVIDOR); dir_udp_srv.sin_port=htons(PUERTO_UDP_SERVIDOR);
tam_dir=sizeof(struct sockaddr_in);
while(1/*(fich=LeerOrden(&mensaje))!=-1*/) { printf("\nCliente:Elija una de las siguentes opciones\n"); printf("- 1 Registrarse\n"); printf("- 2 Iniciar sesion\n"); printf("- 3 Cerrar sesion\n"); printf("- 4 Poner un archivo\n"); printf("- 5 Coger un archivo\n"); printf("- 7 Borrar un archivo\n"); printf("- 6 Poner varios archivos\n"); printf("- 7 Coger varios archivos\n"); printf("- 7 Borrar varios archivos\n"); printf("- 7 Salir\n"); opcion = atoi(gets(t));/* Envio de mensaje */ switch(opcion){ case 1: break; case 2: break; case 3: break; case 4:
fprintf(stdout,"Introduzca fichero local: "); scanf("%s",mensaje.local); if (fich<0) fprintf(stdout,"Fichero local '%s' no valido\n", mensaje.local); fprintf(stdout,"Introduzca fichero remoto: "); scanf("%s",mensaje.remoto); mensaje.puerto=htonl(PUERTO_TCP_CLIENTE);
if(sendto(sock_udp,(char*) &mensaje, sizeof(UDP_Msg), 0, (struct sockaddr*) &dir_udp_srv, tam_dir)<0) { fprintf(stdout,"ERROR\n"); close(sock_udp); exit(1); } socket_datos=Abrir_Socket(mensaje.puerto); AQUI<=====Enviar_fichero(socket_datos,fich,mensaje); break; case 5: break; case 6: break; case 7: break; case 8: exit(0); break;
} /*fprintf(stdout,"Enviando %s(%s,%s): ", ntohl(mensaje.op)==GET ? "GET" : "PUT", mensaje.local, mensaje.remoto); if(sendto(sock_udp,(char*) &mensaje, sizeof(UDP_Msg), 0, (struct sockaddr*) &dir_udp_srv, tam_dir)<0) { fprintf(stdout,"ERROR\n"); close(sock_udp); exit(1); } fprintf(stdout,"OK\n");*/
/* Lectura de la respuesta */ /*fprintf(stdout,"Respuesta del servidor: "); if(recvfrom(sock_udp,(char*) &respuesta, sizeof(UDP_Msg), 0, (struct sockaddr*) &dir_udp_srv, &tam_dir) <0) { fprintf(stdout,"<<ERROR>>\n"); close(sock_udp); exit(1); } fprintf(stdout,"%s\n", ntohl(respuesta.op)==OK ? "OK" : "ERROR");*/
/* Si la respuesta es afirmativa se procede a enviar/recibir el fichero */ /* if(ntohl(respuesta.op)==OK) { socket_datos=Abrir_Socket(respuesta.puerto); if(ntohl(mensaje.op)==PUT) Enviar_Fichero(socket_datos,fich); else *//* PUT */ /*Recibir_Fichero(socket_datos,fich); } } } close(sock_udp);*/ }
} /* Funcion que lee una operacion */ /*int LeerOrden(UDP_Msg *m) { int fich;
do { fprintf(stdout,"\t 1- GET (servidor -> cliente)\n"); fprintf(stdout,"\t 2- PUT (cliente -> servidor)\n"); fprintf(stdout,"\t 3- Salir\n"); fprintf(stdout,"Introduzca operacion: "); scanf("%d",&m->op); } while(m->op<1 || m->op>3);
if(m->op==3) return(-1);
m->op=htonl(m->op);
do { fprintf(stdout,"Introduzca fichero local: "); scanf("%s",m->local);
if(ntohl(m->op)==PUT) *//* Debe existir el fichero */ /* fich=open(m->local,O_RDONLY); else if(ntohl(m->op)==GET)*/ /* Debe poder ser creado el fichero (y no existir antes) */ /* fich=creat(m->local,0644);
if (fich<0) fprintf(stdout,"Fichero local '%s' no valido\n", m->local); } while(fich<0);
fprintf(stdout,"Introduzca fichero remoto: "); scanf("%s",m->remoto);
m->puerto=htonl(PUERTO_TCP_CLIENTE);
return(fich); }*/
/* Funcion que abre un nuevo socket TCP para la transmision de datos */ int Abrir_Socket(int puerto_servidor) { int sock_tcp; /* Socket (de tipo TCP) para transmision de datos */ struct sockaddr_in dir_tcp_srv; /* Direccion TCP servidor */
/* Creacion del socket TCP */ fprintf(stdout,"Creacion del socket TCP: "); sock_tcp=socket(AF_INET,SOCK_STREAM,0); if(sock_tcp<0) { fprintf(stdout,"ERROR\n"); exit(1); } fprintf(stdout,"OK\n");
/* Nos conectamos con el servidor */ bzero((char*)&dir_tcp_srv,sizeof(struct sockaddr_in)); /* Pone a 0 la estructura */ dir_tcp_srv.sin_family=AF_INET; dir_tcp_srv.sin_addr.s_addr=inet_addr(HOST_SERVIDOR); dir_tcp_srv.sin_port=htons(PUERTO_TCP_SERVIDOR); fprintf(stdout,"Conexion al puerto servidor: "); if(connect(sock_tcp, (struct sockaddr*)&dir_tcp_srv, sizeof(struct sockaddr_in))<0) { fprintf(stdout,"ERROR %d\n",ERROR); close(sock_tcp); exit(1); } fprintf(stdout,"OK\n");
return(sock_tcp); }
/* Lee datos del fichero y los manda al socket */ int Enviar_Fichero(int sock,int fichero,UDP_Msg m) {
char buff[512]; int tam;
fichero=open(m.local,O_RDONLY);
while((tam=read(fichero,(void*)buff,512))>0) write(sock,(void*)buff,tam); fprintf(stdout,"Introduzca fichero remoto: "); scanf("%s",m.remoto);
m.puerto=htonl(PUERTO_TCP_CLIENTE); close(fichero); close(sock); return((int)fichero);
}
/* Lee datos del socket y los manda al fichero */ int Recibir_Fichero(int sock,int fich,UDP_Msg *m) { char buff[512]; int tam; fprintf(stdout,"Introduzca fichero local: "); scanf("%s",m->local); fich=creat(m->local,0644); if (fich<0) fprintf(stdout,"Fichero local '%s' no valido\n", m->local); while((tam=read(sock,(void*)buff,512))>0) write(fich,(void*)buff,tam); fprintf(stdout,"Introduzca fichero remoto: "); scanf("%s",m->remoto);
m->puerto=htonl(PUERTO_TCP_CLIENTE); close(fich); close(sock); return(fich);
}
y el servidor: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <netdb.h> #include <sys/param.h> #include <sys/socket.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/wait.h> #include <signal.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include "tcp.h"
int Crear_Socket_TCP(); int Check_Remoto (int op,char* fichero); int Abrir_Socket (int sock_tcp); void Enviar_Fichero (int sock,int fich); void Recibir_Fichero (int sock,int fich);
int main(int argc,char* argv[]) { UDP_Msg mensaje, /* Mensaje a recibir */ respuesta; /* Respuesta del servidor */ struct sockaddr_in dir_udp_cli; /* Direccion UDP cliente */ struct sockaddr_in dir_udp_srv; /* Direccion UDP servidor */ int sock_udp; /* Socket (de tipo UDP) para ordenes */ int sock_tcp; /* Socket (de tipo TCP) para servicio */ int socket_datos; /* Socket (TCP) para transmision de datos */ socklen_t tam_dir; /* Tama~no de la direcion del cliente */ int fich; /* Descriptor del fichero remoto */
/* Creacion del socket UDP */ fprintf(stdout,"Creacion del socket UDP: "); sock_udp=socket(AF_INET,SOCK_DGRAM,0); if(sock_udp<0) { fprintf(stdout,"ERROR\n"); exit(1); } fprintf(stdout,"OK\n");
/* Asignacion de la direccion local (del servidor) */ bzero((char*)&dir_udp_srv,sizeof(struct sockaddr_in)); /* Pone a 0 la estructura */ dir_udp_srv.sin_family=AF_INET; dir_udp_srv.sin_addr.s_addr=htonl(INADDR_ANY); dir_udp_srv.sin_port=htons(PUERTO_UDP_SERVIDOR); fprintf(stdout,"Asignacion del puerto servidor: "); if(bind(sock_udp, (struct sockaddr*)&dir_udp_srv, sizeof(struct sockaddr_in))<0) { fprintf(stdout,"ERROR\n"); close(sock_udp); exit(1); } fprintf(stdout,"OK\n");
tam_dir=sizeof(struct sockaddr_in);
/* Creacion del socket TCP de servicio */ sock_tcp=Crear_Socket_TCP();
while(1) { fprintf(stdout,"Esperando mensaje.\n");
/* Recibo mensaje */ fprintf(stdout,"Mensaje del cliente: "); if(recvfrom(sock_udp,(char*) &mensaje, sizeof(UDP_Msg), 0, (struct sockaddr*) &dir_udp_cli, &tam_dir) <0) { fprintf(stdout,"ERROR\n"); close(sock_udp); exit(1); } fprintf(stdout,"%s(%s,%s)\n", ntohl(mensaje.op)==GET ? "GET" : "PUT", mensaje.local, mensaje.remoto);
if((fich=Check_Remoto(mensaje.op,mensaje.remoto))==-1) respuesta.op=htonl(ERROR); /* Error al crear/leer fichero remoto */ else respuesta.op=htonl(OK); /* Fichero remoto correcto */ respuesta.puerto=htonl(PUERTO_TCP_SERVIDOR);
/* Envio del resultado */ fprintf(stdout,"Enviando del resultado [%s]: ", ntohl(respuesta.op)==OK ? "OK" : "ERROR" ); if(sendto(sock_udp,(char*) &respuesta, sizeof(UDP_Msg), 0, (struct sockaddr*) &dir_udp_cli, tam_dir)<0) { fprintf(stdout,"ERROR\n"); close(sock_udp); exit(1); } fprintf(stdout,"OK\n");
/* Si no ha habido errores al definir el fichero remoto se transmite/recibe el fichero */ if(ntohl(respuesta.op)==OK) { socket_datos=Abrir_Socket(sock_tcp); if(ntohl(mensaje.op)==GET) Enviar_Fichero(socket_datos,fich); else /* PUT */ Recibir_Fichero(socket_datos,fich); } }
close(sock_udp); exit(0); } /* Funcion que verifica si se puede crear el fichero (PUT) o si se puede leer el mismo (GET) */ int Check_Remoto(int op, char* fichero) { if(ntohl(op)==GET) /* Debe existir el fichero */ return(open(fichero,O_RDONLY)); if(ntohl(op)==PUT) /* Debe poder ser creado el fichero (y no existir antes) */ return(creat(fichero,0644)); return(-1); }
/* Funcion que crea un socket TCP para la transmision de datos */ int Crear_Socket_TCP() { int sock_tcp; /* Socket (de tipo TCP) para transmision de datos */ struct sockaddr_in dir_tcp_srv; /* Direccion TCP servidor */
/* Creacion del socket TCP */ fprintf(stdout,"Creacion del socket TCP: "); sock_tcp=socket(AF_INET,SOCK_STREAM,0); if(sock_tcp<0) { fprintf(stdout,"ERROR\n"); exit(1); } fprintf(stdout,"OK\n");
/* Asignacion de la direccion local (del servidor) */ bzero((char*)&dir_tcp_srv,sizeof(struct sockaddr_in)); /* Pone a 0 la estructura */ dir_tcp_srv.sin_family=AF_INET; dir_tcp_srv.sin_addr.s_addr=htonl(INADDR_ANY); dir_tcp_srv.sin_port=htons(PUERTO_TCP_SERVIDOR); fprintf(stdout,"Asignacion del puerto servidor: "); if(bind(sock_tcp, (struct sockaddr*)&dir_tcp_srv, sizeof(struct sockaddr_in))<0) { fprintf(stdout,"ERROR\n"); close(sock_tcp); exit(1); } fprintf(stdout,"OK\n");
/* Aceptamos conexiones por el socket */ fprintf(stdout,"Aceptacion de peticiones: "); listen(sock_tcp,5); fprintf(stdout,"OK\n");
return(sock_tcp); }
/* Funcion que abre un nuevo socket TCP para la transmision de datos */ int Abrir_Socket(int sock_tcp) { int socket_nuevo; /* Socket reservado en cada conexion */ struct sockaddr_in dir_tcp_cli; /* Direccion TCP cliente */ socklen_t tam_dir;
tam_dir=sizeof(struct sockaddr_in);
/* Esperamos la llegada de una conexion */ fprintf(stdout,"Llegada de un mensaje: "); socket_nuevo=accept(sock_tcp, (struct sockaddr*) &dir_tcp_cli, &tam_dir); if(socket_nuevo<0) fprintf(stdout,"ERROR\n"); else fprintf(stdout,"OK\n");
return(socket_nuevo); }
/* Lee datos del fichero y los manda al socket */ void Enviar_Fichero(int sock,int fich) { char buff[512]; int tam;
while((tam=read(fich,(void*)buff,512))>0) write(sock,(void*)buff,tam);
close(fich); close(sock); }
/* Lee datos del socket y los manda al fichero */ void Recibir_Fichero(int sock,int fich) { char buff[512]; int tam;
while((tam=read(sock,(void*)buff,512))>0) write(fich,(void*)buff,tam);
close(fich); close(sock); }
alguien sabe porque puede ser?muchisimas gracias. |
|