Professional Documents
Culture Documents
c 26/0
caciones\C\cliente_one.c 26/02/2010, 14:01:29
/*
* cliente_one.c
* Jorge López Aragoneses
* Universidad Carlos III de Madrid
* http://jorgelopezaragoneses.blogspot.com
* 02/06/2009
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/sctp.h>
#include <arpa/inet.h>
#include <errno.h>
#include "common.h"
/** FUNCIONES */
int crearSocket();
char mostrarMenu();
char leerCaracter(int opcion);
void conectarAServidor();
void escribirAServidor(char *texto);
void obtenerDireccion();
void obtenerPuerto();
void obtenerDireccionesBind();
int obtenerDirPrimCliente();
void mostrarDireccionesLocales();
void mostrarDireccionesBindCliente();
void mostrarDireccionesBindServidor();
int main(){
char opcion = '0';
struct sctp_sndrcvinfo sndrcvinfo;
struct sockaddr_in primaryIP; //Almacen para establecer la asociacion primaria
struct sockaddr_in tempIn;
connSock = crearSocket();
//Se muestran las direcciones disponibles para el cliente
mostrarDireccionesLocales();
//Hacer bind de las direcciones del cliente
obtenerDireccionesBind();
Página: 1
Archivo: C:\Documents and Settings\usuario\Mis documentos\DATOS\SCTP\PFC\aplicaciones\C\cliente_one.c 26/0
caciones\C\cliente_one.c 26/02/2010, 14:01:29
switch(opcion){
//Agregar una direccion bind al servidor
case 'A':
case 'a':
escribirAServidor("addIP");
obtenerDireccion();
escribirAServidor(newIP);
printf( "\t- Peticion de agregado enviada al servidor\n" );
break;
//Eliminar una direccion bind del servidor
case 'B':
case 'b':
mostrarDireccionesBindServidor();
escribirAServidor("deleteIP");
obtenerDireccion();
escribirAServidor(newIP);
printf( "\t- Peticion de borrado enviada al servidor\n" );
break;
//Agregar una direccion bind al cliente
case 'C':
case 'c':
mostrarDireccionesLocales();
obtenerDireccion();
break;
//Eliminar una direccion bind del cliente
case 'D':
case 'd':
mostrarDireccionesBindCliente();
obtenerDireccion();
break;
//Obtener las direcciones bind del servidor
case 'E':
case 'e':
Página: 2
Archivo: C:\Documents and Settings\usuario\Mis documentos\DATOS\SCTP\PFC\aplicaciones\C\cliente_one.c 26/0
caciones\C\cliente_one.c 26/02/2010, 14:01:29
i=0;
memset((struct sockaddr_in *)&peerAddrs, 0 , sizeof(peerAddrs));
//Obtiene el numero de direcciones de las que ha hecho bind el servidor
num=sctp_getpaddrs(connSock, status.sstat_assoc_id, &peerAddrs);
//Se imprimen por pantalla las direcciones de las que ha hecho bind el servidor
printf(" El SERVIDOR ha hecho bind de %d direcciones:\n",num);
while( i < num ){
peerInAddrs = (struct sockaddr_in *)peerAddrs;
printf("\t- Direccion %d : %s : %d \n",i,
inet_ntoa((*(peerInAddrs+i)).sin_addr),ntohs((*(peerInAddrs+i)).sin_port) );
i=i+1;
}
mostrarDireccionesBindServidor();
obtenerDireccion();
//Se encapsula la IP
primaryIP.sin_family = PF_INET;
primaryIP.sin_port = htons(puertoServidor);
primaryIP.sin_addr.s_addr = inet_addr(newIP);
Página: 3
Archivo: C:\Documents and Settings\usuario\Mis documentos\DATOS\SCTP\PFC\aplicaciones\C\cliente_one.c 26/0
caciones\C\cliente_one.c 26/02/2010, 14:01:29
ret=obtenerDirPrimCliente();
if( ret != 0){
printf(" ATENCION!! No se pudo obtener la direccion primaria ( errno:
%d)\n",errno);
}else{
primaryIP = *((struct sockaddr_in *)&primaryAssoc.ssp_addr);
printf("\t- Direccion primaria : %s \n",inet_ntoa(primaryIP.sin_addr));
}
break;
//Modificar la direccion primaria del servidor
case 'J':
case 'j':
mostrarDireccionesBindCliente();
obtenerDireccion();
escribirAServidor("setPrimaryAssoc");
//Se mandan los datos
escribirAServidor(newIP);
break;
//Mostrar la direccion primaria del servidor
case 'K':
case 'k':
escribirAServidor("getPrimaryAssoc");
break;
//Cerrar aplicacion
case 'L':
case 'l':
close(connSock);
//Se manda la orden al servidor para que finalice la sesion de este cliente
escribirAServidor("fin");
printf(" -- FIN DE LA APLICACION -- \n\n");
break;
return 0;
}
int crearSocket(){
struct sctp_initmsg initmsg;
struct sctp_event_subscribe events;
int cSocket;
Página: 4
Archivo: C:\Documents and Settings\usuario\Mis documentos\DATOS\SCTP\PFC\aplicaciones\C\cliente_one.c 26/0
caciones\C\cliente_one.c 26/02/2010, 14:01:29
return cSocket;
}
char mostrarMenu(){
char c;
c = leerCaracter(0);
printf("\n");
return c;
}
void conectarAServidor(){
struct sockaddr_in addrsConnectx [5]; //Streams cliente/servidor
struct sockaddr_in servaddr; //Almacen temporal de un stream cliente/servidor
int estado;
int cont=0;
int error=0;
int existe = 0;
char resp;
int numAddrs=0;
printf(" Introduzca una a una las DIRECCIONES del SERVIDOR a las que desea
conectarse\n");
do{
Página: 5
Archivo: C:\Documents and Settings\usuario\Mis documentos\DATOS\SCTP\PFC\aplicaciones\C\cliente_one.c 26/0
caciones\C\cliente_one.c 26/02/2010, 14:01:29
error=0;
//Almacenar direcciones para establecer la conexion
do{
//Se recoge la direccion
obtenerDireccion();
//Se recoge el puerto
obtenerPuerto(0);
//Se da valor a la estructura
memset((void *)&servaddr, 0 , sizeof(servaddr));
servaddr.sin_family = PF_INET;
servaddr.sin_port = htons(puertoServidor);
servaddr.sin_addr.s_addr = inet_addr(newIP);
//Se añade al array de direcciones
addrsConnectx [cont] = servaddr;
cont=cont+1;
numAddrs=numAddrs+1;
//Comprobar si el usuario desea añadir mas direcciones
do{
printf("\tDesea introducir otra direccion ? (Y/N) ");
resp = leerCaracter(1);
printf("\n");
}while(resp == 'e');
Página: 6
Archivo: C:\Documents and Settings\usuario\Mis documentos\DATOS\SCTP\PFC\aplicaciones\C\cliente_one.c 26/0
caciones\C\cliente_one.c 26/02/2010, 14:01:29
//Almacenar direcciones
do{
//Se recoge la direccion
obtenerDireccion();
//Se recoge el puerto
obtenerPuerto(1);
//Se da valor a la estructura
memset((void *)&clientaddr, 0 , sizeof(clientaddr));
clientaddr.sin_family = PF_INET;
clientaddr.sin_port = htons(puertoCliente);
clientaddr.sin_addr.s_addr = inet_addr(newIP);
//Se añade al array de direcciones
bindIPs [numClientAddrs] = clientaddr;
numClientAddrs++;
//Comprobar si el usuario desea añadir mas direcciones
do{
printf("\tDesea introducir otra direccion ? (Y/N) ");
resp = leerCaracter(1);
printf("\n");
}while(resp == 'e');
//Muestra por pantalla las direcciones de la maquina local mediante el comando ifconfig
void mostrarDireccionesLocales(){
printf(" Direcciones disponibles en el cliente\n");
system("/sbin/ifconfig | grep 'inet addr' | awk '{ print($2) }' | cut -d : -f 2");
printf("\n");
}
if(opcion == 1){
if(c != 'Y' && c != 'y' && c != 'N' && c != 'n'){
printf(" ATENCION!! Debe responder Y/y o N/n \n");
c = 'e';
}
}
return c;
}
//Muestra por pantalla las direcciones de las que ha hecho bind el cliente
Página: 7
Archivo: C:\Documents and Settings\usuario\Mis documentos\DATOS\SCTP\PFC\aplicaciones\C\cliente_one.c 26/0
caciones\C\cliente_one.c 26/02/2010, 14:01:29
void mostrarDireccionesBindCliente(){
i=0;
memset((struct sockaddr_in *)&localAddrs, 0 , sizeof(localAddrs));
//Obtiene el numero de direcciones de las que ha hecho bind el cliente
num=sctp_getladdrs(connSock, status.sstat_assoc_id, &localAddrs);
//Se imprimen por pantalla las direcciones de las que ha hecho bind el cliente
printf(" Direcciones bind actuales en el CLIENTE:\n");
while( i < num ){
localInAddrs = (struct sockaddr_in *)localAddrs;
printf("\t %s : %d \n", inet_ntoa((*(localInAddrs+i)).sin_addr),
ntohs((*(localInAddrs+i)).sin_port) );
i=i+1;
}
printf("\n");
//Se libera la memoria ocupada por las direcciones obtenidas
sctp_freeladdrs(localAddrs);
}
Página: 8
Archivo: C:\Documents and Settings\usuario\Mis documentos\DATOS\SCTP\PFC\aplicaciones\C\cliente_one.c 26/0
caciones\C\cliente_one.c 26/02/2010, 14:01:29
if(tipo == 1){
if(puertoCliente == 0){
puertoCliente=0;
scanf("%d", &puertoCliente);
getchar();
}else{
printf("%d\n",puertoCliente);
}
}else{
puertoServidor=0;
scanf("%d", &puertoServidor);
getchar();
}
printf("\n");
}
Página: 9