bomberstudent_server.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /*
  2. * File: bomberstudent_server.c
  3. * Author: Arthur Brandao
  4. *
  5. * Created on 14 novembre 2018
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <pthread.h>
  10. #include "arraylist.h"
  11. #include "bomberstudent_server.h"
  12. #include "error.h"
  13. /* --- Globale --- */
  14. arraylist get;
  15. arraylist post;
  16. /* --- Fonctions privées --- */
  17. void* udp_thread(void* data){
  18. Server s;
  19. char buffer[BUFFER_SIZE];
  20. //Cast data en serveur
  21. s = (Server) data;
  22. //Detache le thread
  23. if(pthread_detach(pthread_self()) != 0){
  24. return NULL;
  25. }
  26. //Boucle attente
  27. while(true){
  28. //Attente connexion
  29. if(s->server_receive(s, buffer, BUFFER_SIZE) == ERR){
  30. addserror("Impossible de recevoir le demande de recherche");
  31. continue;
  32. }
  33. //Si la phrase est correcte
  34. if(strncmp(buffer, SEARCH_SERV, strlen(buffer)) == 0){
  35. if(!s->server_send(s, "i'm a bomberstudent server")){
  36. addserror("Impossible de repondre à la recherche");
  37. }
  38. }
  39. }
  40. return NULL;
  41. }
  42. //Thread initialisation de la communication principale entre client et serveur
  43. //Connexion utilisé pour traiter les requetes emise par le client
  44. void* tcp_cli_thread(void* data){
  45. Server s;
  46. //Cast data en serveur
  47. s = (Server) data;
  48. //Detache le thread
  49. if(pthread_detach(pthread_self()) != 0){
  50. return NULL;
  51. }
  52. //Boucle attente
  53. while(true){
  54. }
  55. return NULL;
  56. }
  57. //Thread initialisation de la communication utilisé par le serveur pour notifier les clients
  58. void* tcp_serv_thread(void* data){
  59. Server s;
  60. //Cast data en serveur
  61. s = (Server) data;
  62. //Detache le thread
  63. if(pthread_detach(pthread_self()) != 0){
  64. return NULL;
  65. }
  66. //Boucle attente
  67. while(true){
  68. }
  69. return NULL;
  70. }
  71. /* --- Fonctions publiques --- */
  72. void ini_server(){
  73. arraylist_ini(&get);
  74. arraylist_ini(&post);
  75. }
  76. void add_handler(char* method, char* ressource, int(*handler)(Server, JsonParser*)){
  77. if(strncmp(method, "POST", 5) == 0){
  78. arraylist_add(&post, ressource, handler);
  79. } else if(strncmp(method, "POST", 5) == 0){
  80. arraylist_add(&get, ressource, handler);
  81. }
  82. }
  83. boolean launch_udp_server(int port){
  84. Server s;
  85. pthread_t udp;
  86. //Creation serveur
  87. s = server_create_udp();
  88. if(s == NULL){
  89. addserror("Impossible de créer le serveur UDP");
  90. return false;
  91. }
  92. if(!s->server_bind(s, port)){
  93. addserror("Impossible de bind le serveur UDP");
  94. return false;
  95. }
  96. //Lancement thread serveur udp
  97. if(pthread_create(&udp, NULL, udp_thread, s) != 0){
  98. adderror("Impossible de créer le thread UDP");
  99. server_close(s);
  100. return false;
  101. }
  102. return true;
  103. }
  104. boolean launch_tcp_server(int port){
  105. Server s[2];
  106. pthread_t tcp;
  107. //Creation serveur
  108. s[0] = server_create_tcp();
  109. s[1] = server_create_tcp();
  110. if(s[0] == NULL || s[1] == NULL){
  111. addserror("Impossible de créer les serveurs TCP");
  112. return false;
  113. }
  114. if(!( s[0]->server_bind(s[0], port) && s[1]->server_bind(s[1], port + 1) )){
  115. addserror("Impossible de bind les serveurs TCP");
  116. return false;
  117. }
  118. //Lancement Thread attente connexion TCP
  119. if(pthread_create(&tcp, NULL, tcp_cli_thread, s[0]) != 0){
  120. adderror("Impossible de créer le thread TCP Client");
  121. server_close(s[0]);
  122. server_close(s[1]);
  123. return false;
  124. }
  125. if(pthread_create(&tcp, NULL, tcp_serv_thread, s[1]) != 0){
  126. adderror("Impossible de créer le thread TCP Serveur");
  127. server_close(s[0]);
  128. server_close(s[1]);
  129. return false;
  130. }
  131. return true;
  132. }
  133. boolean receive_client(Server);
  134. boolean send_client(Server, JsonEncoder*);
  135. boolean notify_client(Server, char*, char*, JsonEncoder*);