-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathservidorEjercicioGuia.c
162 lines (125 loc) · 3.71 KB
/
servidorEjercicioGuia.c
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
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <pthread.h>
int contador;
//Estructura necesaria para acceso excluyente
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int i;
int sockets[100];
void *AtenderCliente (void *socket)
{
int sock_conn;
int *s;
s= (int *) socket;
sock_conn= *s;
//int socket_conn = * (int *) socket;
char peticion[512];
char respuesta[512];
int ret;
int terminar =0;
// Entramos en un bucle para atender todas las peticiones de este cliente
//hasta que se desconecte
while (terminar ==0)
{
// Ahora recibimos la petici?n
ret=read(sock_conn,peticion, sizeof(peticion));
printf ("Recibido\n");
// Tenemos que a?adirle la marca de fin de string
// para que no escriba lo que hay despues en el buffer
peticion[ret]='\0';
printf ("Peticion: %s\n",peticion);
// vamos a ver que quieren
char *p = strtok( peticion, "/");
int codigo = atoi (p);
int numForm;
// Ya tenemos el c?digo de la petici?n
char nombre[20];
if (codigo !=0)
{
p = strtok( NULL, "/");
numForm = atoi (p);
p = strtok( NULL, "/");
strcpy (nombre, p);
// Ya tenemos el nombre
printf ("Codigo: %d, Nombre: %s\n", codigo, nombre);
}
if (codigo ==0) //petici?n de desconexi?n
terminar=1;
else if (codigo ==1) //piden la longitd del nombre
sprintf (respuesta,"1/%d/%d",numForm,strlen (nombre));
else if (codigo ==2)
// quieren saber si el nombre es bonito
if((nombre[0]=='M') || (nombre[0]=='S'))
sprintf (respuesta,"2/%d/SI", numForm);
else
sprintf (respuesta,"2/%d/NO", numForm);
else //quiere saber si es alto
{
p = strtok( NULL, "/");
float altura = atof (p);
if (altura > 1.70)
sprintf (respuesta, "3/%d/%s: eres alto",numForm,nombre);
else
sprintf (respuesta, "3/%d/%s: eres bajo",numForm, nombre);
}
if (codigo !=0)
{
printf ("Respuesta: %s\n", respuesta);
// Enviamos respuesta
write (sock_conn,respuesta, strlen(respuesta));
}
if ((codigo ==1)||(codigo==2)|| (codigo==3))
{
pthread_mutex_lock( &mutex ); //No me interrumpas ahora
contador = contador +1;
pthread_mutex_unlock( &mutex); //ya puedes interrumpirme
// notificar a todos los clientes conectados
char notificacion[20];
sprintf (notificacion, "4/%d",contador);
int j;
for (j=0; j< i; j++)
write (sockets[j],notificacion, strlen(notificacion));
}
}
// Se acabo el servicio para este cliente
close(sock_conn);
}
int main(int argc, char *argv[])
{
int sock_conn, sock_listen;
struct sockaddr_in serv_adr;
// INICIALITZACIONS
// Obrim el socket
if ((sock_listen = socket(AF_INET, SOCK_STREAM, 0)) < 0)
printf("Error creant socket");
// Fem el bind al port
memset(&serv_adr, 0, sizeof(serv_adr));// inicialitza a zero serv_addr
serv_adr.sin_family = AF_INET;
// asocia el socket a cualquiera de las IP de la m?quina.
//htonl formatea el numero que recibe al formato necesario
serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
// establecemos el puerto de escucha
serv_adr.sin_port = htons(9050);
if (bind(sock_listen, (struct sockaddr *) &serv_adr, sizeof(serv_adr)) < 0)
printf ("Error al bind");
if (listen(sock_listen, 3) < 0)
printf("Error en el Listen");
contador =0;
pthread_t thread;
i=0;
for (;;){
printf ("Escuchando\n");
sock_conn = accept(sock_listen, NULL, NULL);
printf ("He recibido conexion\n");
sockets[i] =sock_conn;
//sock_conn es el socket que usaremos para este cliente
// Crear thead y decirle lo que tiene que hacer
pthread_create (&thread, NULL, AtenderCliente,&sockets[i]);
i=i+1;
}
}