Академический Документы
Профессиональный Документы
Культура Документы
c 26/
caciones\C\servidor_one.c 26/02/2010, 14:09:03
/*
* servidor_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 <time.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#include <linux/types.h>
#include <linux/sysctl.h>
#include <linux/unistd.h>
#include <netinet/in.h>
#include <netinet/sctp.h>
#include <arpa/inet.h>
#include <errno.h>
#include "common.h"
/**FUNCIONES*/
int crearSocket();
void obtenerDireccionesBind();
char leerCaracter();
void manejarEvento(union sctp_notification* notificacion);
void mostrarDireccionesLocales();
void obtenerDireccion();
void obtenerPuerto(int tipo); //Cliente = 1 ; Servidor = 0
void escribirACliente();
int obtenerDirPrimServidor();
/**VARIABLES GLOBALES*/
int listenSock, ret, connSock, flags, in, fin;
struct sockaddr_in bindIPs [5];
struct sockaddr* peerAddrs; //Almaceara las direcciones del peer
struct sockaddr_in* peerInAddrs;
int numAddrs=0;
int puertoCliente=0;
int puertoServidor=0;
struct sctp_assoc_change* sac;
struct sctp_paddr_change* spc;
struct sctp_remote_error* sre;
struct sctp_send_failed* ssf;
struct sctp_shutdown_event* sse;
struct sctp_adaption_event* sae;
struct sctp_pdapi_event* spe;
unsigned int inStreams, outStreams;
sctp_assoc_t assocID = 0;
struct in_addr IPslocales [5];
struct sockaddr_in dir_cliente; //Almacena la direccion primaria del cliente
struct sctp_prim tempPrim;
char newIP[16];
char buffer[MAX_BUFFER+1];
int main(){
struct sctp_sndrcvinfo sndrcvinfo;
struct sockaddr_in tempIn;
union sctp_notification* notification;
/*if( HAVE_SCTP == 1 ){
printf("¡ATENCION! : Esta maquina no soporta SCTP en esta maquina\n");
printf("Nota : quiza deba cargar el modulo SCTP --> /sbin/modprobe sctp\n");
exit(0);
}*/
Página: 1
Archivo: C:\Documents and Settings\usuario\Mis documentos\DATOS\SCTP\PFC\aplicaciones\C\servidor_one.c 26/
caciones\C\servidor_one.c 26/02/2010, 14:09:03
/* Proceso servidor */
do{
fin = 0;
/* Socket servidor en estado de escucha */
listen( listenSock, 5 );
while( fin == 0 ) {
//Se recoge la orden dada por el cliente
memset( (void *)buffer, 0, sizeof(buffer) );
in = sctp_recvmsg(connSock,(void *)buffer,sizeof(buffer),(struct sockaddr
*)NULL,0,&sndrcvinfo,&flags);
if (in > 0) {
buffer[in-1] = 0;
if( strcmp(buffer,"fin") == 0 ){
fin = 1;
close(connSock);
close(listenSock);
}else if( strcmp(buffer,"getHora") == 0 ){
/*SERVIDOR DE HORA*/
if (in > 0) {
buffer[in-1] = 0;
if (in > 0) {
Página: 2
Archivo: C:\Documents and Settings\usuario\Mis documentos\DATOS\SCTP\PFC\aplicaciones\C\servidor_one.c 26/
caciones\C\servidor_one.c 26/02/2010, 14:09:03
buffer[in-1] = 0;
obtenerPuerto(1);
//Se encapsula la IP
tempIn.sin_family = PF_INET;
tempIn.sin_port = htons(puertoCliente);
tempIn.sin_addr.s_addr = inet_addr(buffer);
ret = obtenerDirPrimServidor();
return 0;
}
//Crea un socket
int crearSocket(){
struct sctp_initmsg initmsg;
struct sctp_event_subscribe events;
int cSocket;
Página: 3
Archivo: C:\Documents and Settings\usuario\Mis documentos\DATOS\SCTP\PFC\aplicaciones\C\servidor_one.c 26/
caciones\C\servidor_one.c 26/02/2010, 14:09:03
return cSocket;
}
//Almacenar direcciones
do{
//Se recoge la direccion
obtenerDireccion();
//Se recoge el puerto del servidor
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
bindIPs [numAddrs] = servaddr;
numAddrs++;
//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');
//Lee un caracter
char leerCaracter(){
char c = getchar();
Página: 4
Archivo: C:\Documents and Settings\usuario\Mis documentos\DATOS\SCTP\PFC\aplicaciones\C\servidor_one.c 26/
caciones\C\servidor_one.c 26/02/2010, 14:09:03
return c;
}
void obtenerDireccion(){
memset(newIP, 0 , 16);
printf("\t- Direccion : ");
scanf("%s", newIP);
getchar();
}
if(ret == 0){
//Cambiamos la direccion a la que el servidor debe mandar los mensajes
dir_cliente = *((struct sockaddr_in *)&tempPrim.ssp_addr);
}
//Se envia la hora local
memset( (void *)buffer, 0, sizeof(buffer) );
snprintf( buffer, MAX_BUFFER, "%s", ctime(¤tTime) );
ret = sctp_sendmsg( connSock, (void *)buffer, (size_t)strlen(buffer),(struct sockaddr
*)&dir_cliente, sizeof(struct sockaddr), 0, 0, LOCALTIME_STREAM, 0, 0 );
Página: 5
Archivo: C:\Documents and Settings\usuario\Mis documentos\DATOS\SCTP\PFC\aplicaciones\C\servidor_one.c 26/
caciones\C\servidor_one.c 26/02/2010, 14:09:03
Página: 6