Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.46 KB | None | 0 0
  1. void inicializarServidor(){
  2.  
  3. t_config* config = obtenerConfigDeFS();
  4.  
  5. int PUERTO = config_get_int_value(config, "PUERTO_ESCUCHA");
  6.  
  7. struct addrinfo hints;
  8. struct addrinfo *serverInfo;
  9.  
  10. memset(&hints, 0, sizeof(hints));
  11. hints.ai_family = AF_UNSPEC;
  12. hints.ai_flags = AI_PASSIVE;
  13. hints.ai_socktype = SOCK_STREAM;
  14.  
  15. getaddrinfo(NULL, PUERTO, &hints, &serverInfo);
  16.  
  17. /*
  18. * Descubiertos los misterios de la vida (por lo menos, para la conexion de red actual), necesito enterarme de alguna forma
  19. * cuales son las conexiones que quieren establecer conmigo.
  20. *
  21. * Para ello, y basandome en el postulado de que en Linux TODO es un archivo, voy a utilizar... Si, un archivo!
  22. *
  23. * Mediante socket(), obtengo el File Descriptor que me proporciona el sistema (un integer identificador).
  24. *
  25. */
  26. /* Necesitamos un socket que escuche las conecciones entrantes */
  27. int listenningSocket;
  28. listenningSocket = socket(serverInfo->ai_family, serverInfo->ai_socktype, serverInfo->ai_protocol);
  29.  
  30. /*
  31. * Perfecto, ya tengo un archivo que puedo utilizar para analizar las conexiones entrantes. Pero... ¿Por donde?
  32. *
  33. * Necesito decirle al sistema que voy a utilizar el archivo que me proporciono para escuchar las conexiones por un puerto especifico.
  34. *
  35. */
  36. bind(listenningSocket,serverInfo->ai_addr, serverInfo->ai_addrlen);
  37. freeaddrinfo(serverInfo); // Ya no lo vamos a necesitar
  38.  
  39. /*
  40. * Ya tengo un medio de comunicacion (el socket) y le dije por que "telefono" tiene que esperar las llamadas.
  41. *
  42. * Solo me queda decirle que vaya y escuche!
  43. *
  44. */
  45.  
  46. t_request request;
  47.  
  48. while(1){
  49. listen(listenningSocket, BACKLOG); // IMPORTANTE: listen() es una syscall BLOQUEANTE.
  50. /*
  51. * El sistema esperara hasta que reciba una conexion entrante...
  52. * ...
  53. * ...
  54. * BING!!! Nos estan llamando! ¿Y ahora?
  55. *
  56. * Aceptamos la conexion entrante, y creamos un nuevo socket mediante el cual nos podamos comunicar (que no es mas que un archivo).
  57. *
  58. * ¿Por que crear un nuevo socket? Porque el anterior lo necesitamos para escuchar las conexiones entrantes. De la misma forma que
  59. * uno no puede estar hablando por telefono a la vez que esta esperando que lo llamen, un socket no se puede encargar de escuchar
  60. * las conexiones entrantes y ademas comunicarse con un cliente.
  61. *
  62. * Nota: Para que el listenningSocket vuelva a esperar conexiones, necesitariamos volver a decirle que escuche, con listen();
  63. * En este ejemplo nos dedicamos unicamente a trabajar con el cliente y no escuchamos mas conexiones.
  64. *
  65. */
  66.  
  67. //crearHiloDeAtencion(listenningSocket);
  68.  
  69. pthread_t hilo;
  70. struct sockaddr_in addr; // Esta estructura contendra los datos de la conexion del cliente. IP, puerto, etc.
  71. socklen_t addrlen = sizeof(addr);
  72.  
  73. int socketCliente = accept(listenningSocket, (struct sockaddr *) &addr, &addrlen);
  74.  
  75. /*
  76. * Ya estamos listos para recibir paquetes de nuestro cliente...
  77. *
  78. * Vamos a ESPERAR (ergo, funcion bloqueante) que nos manden los paquetes, y los imprimieremos por pantalla.
  79. *
  80. * Cuando el cliente cierra la conexion, recv() devolvera 0.
  81. */
  82. char package[PACKAGESIZE];
  83. int status = 1; // Estructura que manjea el status de los recieve.
  84.  
  85. printf("Cliente conectado. Esperando mensajes:\n");
  86.  
  87. /*while (status != 0){
  88. status = recv(socketCliente, (void*) package, PACKAGESIZE, 0);
  89. if (status != 0) printf("%s", package);
  90. }*/
  91.  
  92. request = recibirRequest(socketCliente);
  93.  
  94. atenderRequest(request);
  95.  
  96. close(socketCliente);
  97. }
  98.  
  99. /*
  100. * Terminado el intercambio de paquetes, cerramos todas las conexiones.
  101. */
  102.  
  103. close(listenningSocket);
  104.  
  105.  
  106. return;
  107. }
  108.  
  109. void atenderRequest(t_request request, int socketCliente){
  110. switch(request.header){
  111. case 1: // SELECT
  112.  
  113. char* respuesta = selectLFS(request.nombre_tabla, string_itoa(request.key));
  114. int tamanioBuffer = sizeof(respuesta);
  115. send(socketCliente, respuesta, tamanioBuffer, NULL);
  116.  
  117. break;
  118. case 2: // INSERT
  119.  
  120. insertLFS(request.nombre_tabla, string_itoa(request.key), request.value, string_itoa(request.timestamp));
  121.  
  122. break;
  123. case 3: // CREATE
  124.  
  125. char* consistencia = malloc(3);
  126.  
  127. switch(request.tipo_consistencia){
  128. case 1:
  129. consistencia = "SC";
  130. break;
  131. case 2:
  132. consistencia = "SHC";
  133. break;
  134. case 3:
  135. consistencia = "EC";
  136. }
  137.  
  138. createLFS(request.nombre_tabla, consistencia, string_itoa(request.numero_particiones), string_itoa(request.compaction_time));
  139. // ^---arreglar, me mandan un int
  140. free(consistencia);
  141. break;
  142. case 4: // DESCRIBE
  143.  
  144. break;
  145. case 5: // DROP
  146.  
  147. dropLSF(request.nombre_tabla);
  148.  
  149. break;
  150.  
  151. }
  152.  
  153. return;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement