/*
* Se le pasa un socket de servidor y acepta en el una conexion de cliente.
* devuelve el descriptor del socket del cliente o -1 si hay problemas.
* Esta funcion vale para socket AF_INET o AF_UNIX.
*/
int Servidor_Acepta_Conexion_Del_Cliente (int Descriptor)
{
socklen_t Longitud_Cliente;
struct sockaddr Cliente;
int Hijo;
/*
* La llamada a la funcion accept requiere que el parametro
* Longitud_Cliente contenga inicialmente el tamano de la
* estructura Cliente que se le pase. A la vuelta de la
* funcion, esta variable contiene la longitud de la informacion
* util devuelta en Cliente
*/
Longitud_Cliente = sizeof (Cliente);
Hijo = accept (Descriptor, &Cliente, &Longitud_Cliente);
if (Hijo == -1)
return -1;
/*
* Se devuelve el descriptor en el que esta "enchufado" el cliente.
*/
return Hijo;
}
/*
* Abre un socket servidor de tipo AF_INET. Devuelve el descriptor
* del socket o -1 si hay probleamas
* Se pasa como parametro el nombre del servicio. Debe estar dado
* de alta en el fichero /etc/services
*/
int Servidor_Abre_Socket_Inet (char *Servicio, int longitudColaEspera)
{
struct sockaddr_in Direccion;
struct sockaddr Cliente;
socklen_t Longitud_Cliente;
struct servent *Puerto;
int Descriptor;
/*
* se abre el socket
*/
Descriptor = socket (AF_INET, SOCK_STREAM, 0);
if (Descriptor == -1)
return -1;
/*
* Se obtiene el servicio del fichero /etc/services
*/
Puerto = getservbyname (Servicio, "tcp");
if (Puerto == NULL)
return -1;
/*
* Se rellenan los campos de la estructura Direccion, necesaria
* para la llamada a la funcion bind()
*/
Direccion.sin_family = AF_INET;
Direccion.sin_port = htons(Puerto->s_port);
Direccion.sin_addr.s_addr = htonl(INADDR_ANY);
//Direccion.sin_port = (Puerto->s_port);
//Direccion.sin_addr.s_addr = (INADDR_ANY);
if (bind (
Descriptor,
(struct sockaddr *)&Direccion,
sizeof (Direccion)) == -1)
{
close (Descriptor);
return -1;
}
/*
* Se avisa al sistema que comience a atender llamadas de clientes
*/
if (listen (Descriptor, longitudColaEspera) == -1)
{
close (Descriptor);
return -1;
}
/*
* Se devuelve el descriptor del socket servidor
*/
return Descriptor;
}
/*
/ Conecta con un servidor remoto a traves de socket INET
*/
int Cliente_Abre_Conexion_Inet (char *Host_Servidor, char *Servicio)
{
struct sockaddr_in Direccion;
struct servent *Puerto;
struct hostent *Host;
int Descriptor;
Puerto = getservbyname (Servicio, "tcp");
if (Puerto == NULL)
return -1;
Host = gethostbyname (Host_Servidor);
if (Host == NULL)
return -1;
Direccion.sin_family = AF_INET;
Direccion.sin_addr.s_addr = ((struct in_addr *)(Host->h_addr))->s_addr;
Direccion.sin_port = htons(Puerto->s_port);
//Direccion.sin_port = (Puerto->s_port);
Descriptor = socket (AF_INET, SOCK_STREAM, 0);
if (Descriptor == -1)
return -1;
if (connect (
Descriptor,
(struct sockaddr *)&Direccion,
sizeof (Direccion)) == -1)
{
return -1;
}
return Descriptor;
}