Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void inicializarServidor(){
- t_config* config = obtenerConfigDeFS();
- int PUERTO = config_get_int_value(config, "PUERTO_ESCUCHA");
- struct addrinfo hints;
- struct addrinfo *serverInfo;
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_UNSPEC;
- hints.ai_flags = AI_PASSIVE;
- hints.ai_socktype = SOCK_STREAM;
- getaddrinfo(NULL, PUERTO, &hints, &serverInfo);
- /*
- * Descubiertos los misterios de la vida (por lo menos, para la conexion de red actual), necesito enterarme de alguna forma
- * cuales son las conexiones que quieren establecer conmigo.
- *
- * Para ello, y basandome en el postulado de que en Linux TODO es un archivo, voy a utilizar... Si, un archivo!
- *
- * Mediante socket(), obtengo el File Descriptor que me proporciona el sistema (un integer identificador).
- *
- */
- /* Necesitamos un socket que escuche las conecciones entrantes */
- int listenningSocket;
- listenningSocket = socket(serverInfo->ai_family, serverInfo->ai_socktype, serverInfo->ai_protocol);
- /*
- * Perfecto, ya tengo un archivo que puedo utilizar para analizar las conexiones entrantes. Pero... ¿Por donde?
- *
- * Necesito decirle al sistema que voy a utilizar el archivo que me proporciono para escuchar las conexiones por un puerto especifico.
- *
- */
- bind(listenningSocket,serverInfo->ai_addr, serverInfo->ai_addrlen);
- freeaddrinfo(serverInfo); // Ya no lo vamos a necesitar
- /*
- * Ya tengo un medio de comunicacion (el socket) y le dije por que "telefono" tiene que esperar las llamadas.
- *
- * Solo me queda decirle que vaya y escuche!
- *
- */
- t_request request;
- while(1){
- listen(listenningSocket, BACKLOG); // IMPORTANTE: listen() es una syscall BLOQUEANTE.
- /*
- * El sistema esperara hasta que reciba una conexion entrante...
- * ...
- * ...
- * BING!!! Nos estan llamando! ¿Y ahora?
- *
- * Aceptamos la conexion entrante, y creamos un nuevo socket mediante el cual nos podamos comunicar (que no es mas que un archivo).
- *
- * ¿Por que crear un nuevo socket? Porque el anterior lo necesitamos para escuchar las conexiones entrantes. De la misma forma que
- * uno no puede estar hablando por telefono a la vez que esta esperando que lo llamen, un socket no se puede encargar de escuchar
- * las conexiones entrantes y ademas comunicarse con un cliente.
- *
- * Nota: Para que el listenningSocket vuelva a esperar conexiones, necesitariamos volver a decirle que escuche, con listen();
- * En este ejemplo nos dedicamos unicamente a trabajar con el cliente y no escuchamos mas conexiones.
- *
- */
- //crearHiloDeAtencion(listenningSocket);
- pthread_t hilo;
- struct sockaddr_in addr; // Esta estructura contendra los datos de la conexion del cliente. IP, puerto, etc.
- socklen_t addrlen = sizeof(addr);
- int socketCliente = accept(listenningSocket, (struct sockaddr *) &addr, &addrlen);
- /*
- * Ya estamos listos para recibir paquetes de nuestro cliente...
- *
- * Vamos a ESPERAR (ergo, funcion bloqueante) que nos manden los paquetes, y los imprimieremos por pantalla.
- *
- * Cuando el cliente cierra la conexion, recv() devolvera 0.
- */
- char package[PACKAGESIZE];
- int status = 1; // Estructura que manjea el status de los recieve.
- printf("Cliente conectado. Esperando mensajes:\n");
- /*while (status != 0){
- status = recv(socketCliente, (void*) package, PACKAGESIZE, 0);
- if (status != 0) printf("%s", package);
- }*/
- request = recibirRequest(socketCliente);
- atenderRequest(request);
- close(socketCliente);
- }
- /*
- * Terminado el intercambio de paquetes, cerramos todas las conexiones.
- */
- close(listenningSocket);
- return;
- }
- void atenderRequest(t_request request, int socketCliente){
- switch(request.header){
- case 1: // SELECT
- char* respuesta = selectLFS(request.nombre_tabla, string_itoa(request.key));
- int tamanioBuffer = sizeof(respuesta);
- send(socketCliente, respuesta, tamanioBuffer, NULL);
- break;
- case 2: // INSERT
- insertLFS(request.nombre_tabla, string_itoa(request.key), request.value, string_itoa(request.timestamp));
- break;
- case 3: // CREATE
- char* consistencia = malloc(3);
- switch(request.tipo_consistencia){
- case 1:
- consistencia = "SC";
- break;
- case 2:
- consistencia = "SHC";
- break;
- case 3:
- consistencia = "EC";
- }
- createLFS(request.nombre_tabla, consistencia, string_itoa(request.numero_particiones), string_itoa(request.compaction_time));
- // ^---arreglar, me mandan un int
- free(consistencia);
- break;
- case 4: // DESCRIBE
- break;
- case 5: // DROP
- dropLSF(request.nombre_tabla);
- break;
- }
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement