1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
// ********************************************************************************************************
// Servicio: ogAdmRepo
// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla
// Fecha Creación: Marzo-2010
// Fecha Última modificación: Marzo-2010
// Nombre del fichero: ogAdmRepo.cpp
// Descripción :Este fichero implementa el servicio de administración general del sistema
// ********************************************************************************************************
#include "ogAdmRepo.h"
#include "ogAdmLib.c"
//________________________________________________________________________________________________________
// Función: tomaConfiguracion
//
// Descripción:
// Lee el fichero de configuración del servicio
// Parámetros:
// filecfg : Ruta completa al fichero de configuración
// Devuelve:
// TRUE: Si el proceso es correcto
// FALSE: En caso de ocurrir algún error
//________________________________________________________________________________________________________
BOOLEAN tomaConfiguracion(char* filecfg) {
char modulo[] = "tomaConfiguracion()";
if (filecfg == NULL || strlen(filecfg) == 0) {
errorLog(modulo, 1, FALSE); // Fichero de configuración del servicio vacío
return (FALSE);
}
FILE *fcfg;
long lSize;
char * buffer, *lineas[MAXPRM], *dualparametro[2];
int i, numlin, resul;
fcfg = fopen(filecfg, "rt");
if (fcfg == NULL) {
errorLog(modulo, 2, FALSE); // No existe fichero de configuración del servicio
return (FALSE);
}
fseek(fcfg, 0, SEEK_END);
lSize = ftell(fcfg); // Obtiene tamaño del fichero.
rewind(fcfg);
buffer = (char*) reservaMemoria(lSize+1); // Toma memoria para el buffer de lectura.
if (buffer == NULL) { // No hay memoria suficiente para el buffer
errorLog(modulo, 3, FALSE);
return (FALSE);
}
fread(buffer, 1, lSize, fcfg); // Lee contenido del fichero
buffer[lSize]=(char) NULL;
fclose(fcfg);
iplocal[0] = (char) NULL; //inicializar variables globales
puerto[0] = (char) NULL;
numlin = splitCadena(lineas, buffer, '\n');
for (i = 0; i < numlin; i++) {
splitCadena(dualparametro, lineas[i], '=');
resul = strcmp(StrToUpper(dualparametro[0]), "IPLOCAL");
if (resul == 0)
strcpy(iplocal, dualparametro[1]);
resul = strcmp(StrToUpper(dualparametro[0]), "PUERTO");
if (resul == 0)
strcpy(puerto, dualparametro[1]);
}
if (iplocal[0] == (char) NULL) {
errorLog(modulo, 4, FALSE); // Falta parámetro IPLOCAL
return (FALSE);
}
if (puerto[0] == (char) NULL) {
errorLog(modulo, 5, FALSE); // Falta parámetro PUERTO
return (FALSE);
}
return (TRUE);
}
// ________________________________________________________________________________________________________
// Función: gestionaTrama
//
// Descripción:
// Procesa las tramas recibidas .
// Parametros:
// - s : Socket usado para comunicaciones
// Devuelve:
// TRUE: Si el proceso es correcto
// FALSE: En caso de ocurrir algún error
// ________________________________________________________________________________________________________
BOOLEAN gestionaTrama(SOCKET *socket_c)
{
TRAMA* ptrTrama;
int i, res;
char *nfn;
char modulo[] = "gestionaTrama()";
ptrTrama=recibeTrama(socket_c);
if (ptrTrama){
INTROaFINCAD(ptrTrama);
nfn = copiaParametro("nfn",ptrTrama); // Toma dirección/es IP
for (i = 0; i < MAXIMAS_FUNCIONES; i++) { // Recorre funciones que procesan las tramas
res = strcmp(tbfuncionesRepo[i].nf, nfn);
if (res == 0) { // Encontrada la función que procesa el mensaje
return (tbfuncionesRepo[i].fptr(socket_c, ptrTrama)); // Invoca la función
}
}
}
else
errorLog(modulo, 17, FALSE); // Error en la recepción
return (TRUE);
}
// ********************************************************************************************************
// PROGRAMA PRINCIPAL (SERVICIO)
// ********************************************************************************************************
int main(int argc, char *argv[])
{
SOCKET socket_r; // Socket donde escucha el servidor
SOCKET socket_c; // Socket de los clientes que se conectan
socklen_t iAddrSize;
struct sockaddr_in local, cliente;
char modulo[] = "main()";
/*--------------------------------------------------------------------------------------------------------
Validación de parámetros de ejecución y lectura del fichero de configuración del servicio
---------------------------------------------------------------------------------------------------------*/
if (!validacionParametros(argc, argv,1)) // Valida parámetros de ejecución
exit(EXIT_FAILURE);
if (!tomaConfiguracion(szPathFileCfg)) { // Toma parametros de configuracion
exit(EXIT_FAILURE);
}
/*--------------------------------------------------------------------------------------------------------
Carga del catálogo de funciones que procesan las tramas (referencia directa por puntero a función)
---------------------------------------------------------------------------------------------------------*/
int cf = 0;
cf++;
/*--------------------------------------------------------------------------------------------------------
Creación y configuración del socket del servicio
---------------------------------------------------------------------------------------------------------*/
socket_r = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Crea socket del servicio
if (socket_r == SOCKET_ERROR) { // Error al crear el socket del servicio
errorLog(modulo, 13, TRUE);
exit(EXIT_FAILURE);
}
local.sin_addr.s_addr = htonl(INADDR_ANY); // Configura el socket del servicio
local.sin_family = AF_INET;
local.sin_port = htons(atoi(puerto));
if (bind(socket_r, (struct sockaddr *) &local, sizeof(local))== SOCKET_ERROR) { // Enlaza socket
errorLog(modulo, 14, TRUE);
exit(EXIT_FAILURE);
}
listen(socket_r, 250); // Pone a escuchar al socket
iAddrSize = sizeof(cliente);
/*--------------------------------------------------------------------------------------------------------
Bucle para acceptar conexiones
---------------------------------------------------------------------------------------------------------*/
infoLog(1); // Inicio de sesión
while(TRUE) {
socket_c = accept(socket_r, (struct sockaddr *) &cliente, &iAddrSize);
if (socket_c == INVALID_SOCKET) {
errorLog(modulo, 15, TRUE);
exit(EXIT_FAILURE);
}
if(!gestionaTrama(&socket_c)){
errorLog(modulo, 39, TRUE);
break;
}
close(socket_c);
}
/*--------------------------------------------------------------------------------------------------------
Fin del servicio
---------------------------------------------------------------------------------------------------------*/
close(socket_r);
exit(EXIT_SUCCESS);
}
|