/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

cliente sockets

 
      Índice del Foro elrincondelc.com -> Programación en Servidores
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
hefize



Registrado: 03 Dic 2006
Mensajes: 7

MensajePublicado: 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.
Volver arriba
hefize



Registrado: 03 Dic 2006
Mensajes: 7

MensajePublicado: 15/12/2006 11:08 am
Título: Solucion

hola
esta mal escrita la declaracion de la funcion, es Enviar_Fichero
es decir la f con mayusculaaa!!jejeje, has avanzado en el codigo?es para ver si me lo puedes dejar porque estoy haciendo lo mismo!!y tengo que entregarlo el lunes, muchas gracias
Volver arriba
      Índice del Foro elrincondelc.com -> Programación en Servidores
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com