-
Notifications
You must be signed in to change notification settings - Fork 0
/
schat.c
134 lines (115 loc) · 3.79 KB
/
schat.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
/* Archivo: procesarinstrucciones.c
* Autores: Oriana Gomez 09-10336
* Ivan Travecedo 08-11131
* Descripcion: Archivo Principal de schat. Funciona como servidor del Chat
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include "menuschat.h"
#include "lista.h"
#define MAXDATASIZE 100
#define PORT 20336/* El puerto que será abierto por defecto */
int socketservidor, socketcliente; /* los ficheros descriptores */
ListaThread * listaHilos; // lista de hilos dinamica
/* Procedimiento: printListaPPal
* Descripcion: procedimiento que ejecuta cada hilo de cada usuario
* imprime lo que recibe del servidor
* Parametro: Thread * elem: elemento que tiene el fd del que va a
* recibir
*/
void * atenderPeticion(Thread * elem){
char cmd[MAXDATASIZE];/* en donde es almacenara el texto recibido */
char usr[20];/* en donde es almacenara el usuario recibido */
int numbytes;
char bienvenida[] = "Bienvenido a IOChat\n";
int existe = -1;
if (send(elem->fd,bienvenida,strlen(bienvenida),0)==-1){
printf("Error atendiendo peticion\n");
pthread_exit(NULL);
}
while(1){
bzero(cmd, MAXDATASIZE);
bzero(usr, 20);
if ((numbytes=recv(elem->fd,usr,20,0)) == -1){
printf("Error en recv usuario()\n");
exit(-1);
}
if ((numbytes=recv(elem->fd,cmd,MAXDATASIZE,0)) == -1){
printf("Error en recv Instruccion()\n");
exit(-1);
}
printf("Usuario recibido: %s\n", usr);
printf("Instruc recibida: %s\n", cmd);
if(existe == -1){
existeUsuario(usr, sala, elem->fd);
existe = 0;
}
generarInstrucciones(sala, usr, cmd, elem->fd);
if(strcmp(cmd,"fue")==0){
printf("Usuario %s cerro sesion\n",usr);
break;
}
}
close(elem->fd);
pthread_exit(NULL);
}
/* Procedimiento: manejoSocket
* Descripcion: Se crea el socket del servidor, se asocia el puerto
* y se pone a escuchar. Por cada usuario conectado crea
* un hilo que lo atiende y sigue esperando nuevas
* conexiones
*/
void manejoSocket() {
char usr[MAXDATASIZE];
struct sockaddr_in servidor;
struct sockaddr_in cliente;
int tamsocket, numbytes;
listaHilos = (ListaThread *)malloc(sizeof(ListaThread));
nuevaListaT(listaHilos);
if ((socketservidor=socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {
printf("error en socket()\n");
exit(-1);
}
servidor.sin_family = AF_INET;
servidor.sin_port = htons(PORT);
servidor.sin_addr.s_addr = INADDR_ANY;
bzero(&(servidor.sin_zero),8);
if(bind(socketservidor,(struct sockaddr*)&servidor, sizeof(struct sockaddr))==-1) {
printf("error en bind() \n");
exit(-1);
}
if(listen(socketservidor,SOMAXCONN) == -1){
printf("error en listen()\n");
exit(-1);
}
/* A continuación la llamada a accept() */
tamsocket=sizeof(struct sockaddr_in);
while(1) {
printf("Esperando por cliente nuevo\n");
/*Acepto nueva solicitud de cliente*/
if ((socketcliente = accept(socketservidor,(struct sockaddr *)&cliente, &tamsocket))==-1) {
printf("error en accept()\n");
exit(-1);
}
printf("socketcliente antes de crear hilo: %d\n", socketcliente);
// inserto un nuevo elemento en la lista de hilos y tomo el primero
insertarT(listaHilos,(pthread_t)NULL,socketcliente);
if (pthread_create(&(listaHilos->ini->id), NULL, (void *)&atenderPeticion,(void *)(listaHilos->ini))!=0){
printf("Error creacion hilo");
}
}
close(socketcliente);
}
int main(int argc, char *argv[]) {
menuschat(argc, argv);
crearUsuariosSalas(sala);
manejoSocket();
close(socketservidor);
return(0);
}