JEJEJE, buenas, espero haber acertado poniendo este post aqui, sino pido al moderador que lo mueva donde crea conveniente...
El tema es que llevo una semana con este ejercicio y no consigo encontrar el problema... nose a ver si alguien me puede ayudar porque es importante (ejercicio final de programacion) y no soy capaz ni de compilar el cliente correctamente, me da dos errores, al final los pongo... ahora el codigo que llevo por el momento:
struct sockaddr_in servidororigen;
struct servent *Puertoorigen;
struct hostent *Hostorigen;
struct sockaddr_in servidordestino;
struct servent *Puertodestino;
struct hostent *Hostdestino;
char *hosts[2],*ficheros[2];
int sockori,sockdest;
if (argc!=3)
{
printf("Numero de parametros incorrecto\nUso: $>cliente IP_servidor_origen:ruta_fichero_origen IP_servidor_destino:ruta_fichero_destino\n");
exit(-1);
}
//Obtener nombres de Hosts y de Ficheros 0 es Origen y 1 es Destino
hosts[0]=strtok(argv[1],":");
ficheros[0]=strtok(NULL," \n\t");
hosts[1]=strtok(argv[2],":");
ficheros[1]=strtok(NULL," \n\t");
printf("HostOrigen:%s\nHostDestino:%s\nFicheroOrigen:%s\nFicheroDestino:%s\n",hosts[0],hosts[1],ficheros[0],ficheros[1]);
//Tipo de Puertos
if((Puertoorigen=getservbyname(servidororigen,"tcp"))==-1) return -1;
if((Puertodestino=getservbyname(servidordestino,"tcp"))==-1) return -1;
//Hosts
if(inet_addr(hosts[0])==-1)
{
Hostdestino=gethostbyname(hosts[0]);
}
if(inet_addr(hosts[1])==-1)
{
Hostorigen=gethostbyname(hosts[1]);
}
//Insertamos la informacion del servidor origen
servidororigen.sin_family = AF_INET;
servidororigen.sin_addr.s_addr=((struct in_addr *)(Hostorigen->h_addr))->s_addr; /*memcpy(&servidororigen.sin_addr,Hostorigen->h_addr,Hostorigen->h_length);*/
servidororigen.sin_port = Puertoorigen->s_port;
//Insertamos la informacion del servidor destino
servidordestino.sin_family=AF_INET;
servidordestino.sin_addr.s_addr=((struct in_addr *)(Hostdestino->h_addr))->s_addr;
servidordestino.sin_port=Puertodestino->s_port;
Y hasta aqui algo tengo mal DD, los errores me los da en las lineas:
if((Puertoorigen=getservbyname(servidororigen,"tcp"))==-1) return -1;
if((Puertodestino=getservbyname(servidordestino,"tcp"))==-1) return -1;
Y me dice esto:
error:incompatible type for argument 1 of getservbyname
warning: comparision between pointer and integer
error:incompatible type for argument 1 of getservbyname
warning: comparision between pointer and integer
Plzzz ayuda xDD
P.D: Y perdon por el pedazo de tocho
P.D2: Vale, al poco de poner este post parece que lo he arreglado, he sustituido las dos lineas que me daban error por:
servidororigen.sin_port=htons(9004);
servidordestino.sin_port=htons(9004);
if(argc!=2)
{
printf("Direccion IP %s \n", argv[0]); //direccion ip del servidor formato xxx.xxx.xxx.xxx
return(1);
}
hoste=gethostbyname(argv[1]); //segun la ip,obtiene el nombre del host,dominio ....y HOSTE,lo transforma
printf("%s \n", hoste->h_name);
servidor.sin_family=AF_INET;
servidor.sin_addr.s_addr=inet_addr(argv[1]); //funciona con cadena de tipo xxx.xxx.xxx.xxx
servidor.sin_port=htons(PUERTO);
bzero(&(servidor.sin_zero), sizeof(servidor));
if((fdsocket=socket(AF_INET, SOCK_STREAM,0))==-1)
{
perror("Error al abrir el socket\n");
return(1);
}
if(connect(fdsocket, (struct sockaddr *) &servidor,sizeof(servidor))==-1) //conectamos al servidor(descriptor,direccion y puerto de servidor)
{
perror("Error de conexion con el socket\n");
return(1);
}
//nos vamos al servidor
if((numbytes=recv(fdsocket,buffer,MAXBYTES,0))==-1) //recibe hasta 1000bytes y lo copia a buffer y devuelve el numero real de bye leidos
{
perror("Error al recibir respeusta del servidor\n");
return(1);
}
buffer[numbytes]='\0'; //SIEMPRE!!!!!!!
printf("Respuesta del servidor: %s",buffer);
close(fdsocket);
#define PUERTO 5000 //puerto a usar
#define NUMCOM 3 //nnumero de conexiones a encolar
main()
{
int fdsock, fdsock2; //descriptores
struct sockaddr_in servidor; //estructuras servidor
struct sockaddr_in cliente; //" cliente
socklen_t sin_tamanio; //tama?±o strucshock addr
char *mensaje="Conectado con el servidor\n"; //mensaje
if((fdsock=socket(AF_INET,SOCK_STREAM,0))==-1) //crea sock q su descriptor es fdsock(en internet,socket de flujo,y al azar el protocolo)
{
printf("Error al crear el socket");
return(1);
}
//rellena la esctructura del servidor
servidor.sin_family=AF_INET; //dominio internet
servidor.sin_addr.s_addr=INADDR_ANY;//coloca nuestra ip automaticamente
servidor.sin_port=htons(PUERTO);//convierte orden de byte de host a orden de byte de red
bzero(&(servidor.sin_zero),sizeof(servidor));//rellena de 0 el campobzero
if(bind(fdsock,(struct sockaddr *) &servidor,sizeof(servidor))==-1) //asocia un socket con la direccion ip,(descriptor,direccion ip y puerto del servidor,tama?±o de la estructura de la informacion del servidor)
{
perror("llamada para unir");
return(1);
}
if(listen(fdsock,NUMCOM)==-1) //pone a la escuxa al programa con descriptor fdsock como maximo NUMCOM
{
perror("llamada para escuchar");
return(1);
}
while(1) //
{
sin_tamanio=sizeof(cliente); //almacena el tama?±o de la structura del cliente
if((fdsock2=accept(fdsock, (struct sockaddr *) &cliente, &sin_tamanio))==-1) //acepta los mensajes de la cola(max3),y usa escriptor distinto fdsock2,(descriptor,se rellena con la informacion entrante,tama?±o)
{
perror("llamada para aceptar");
return(1);
}
printf("%s\n",inet_ntoa(cliente.sin_addr)); //muestra ip del cliente
////////// nos vamos al cliente
if(send(fdsock2,mensaje,strlen(mensaje),0)==-1) // envia al cliente(fd) el mensaje (mensaje) de tama?±o (strlen)
{
perror("llamada para enviar");
return(1);
}