123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- /*
- * File: bomberstudent_server.c
- * Author: Arthur Brandao
- *
- * Created on 14 novembre 2018
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- #include "arraylist.h"
- #include "bomberstudent_server.h"
- #include "error.h"
- /* --- Globale --- */
- arraylist get;
- arraylist post;
- /* --- Fonctions privées --- */
- void* udp_thread(void* data){
- Server s;
- char buffer[BUFFER_SIZE];
- //Cast data en serveur
- s = (Server) data;
- //Detache le thread
- if(pthread_detach(pthread_self()) != 0){
- return NULL;
- }
- //Boucle attente
- while(true){
- //Attente connexion
- if(s->server_receive(s, buffer, BUFFER_SIZE) == ERR){
- addserror("Impossible de recevoir le demande de recherche");
- continue;
- }
- //Si la phrase est correcte
- if(strncmp(buffer, SEARCH_SERV, strlen(buffer)) == 0){
- if(!s->server_send(s, "i'm a bomberstudent server")){
- addserror("Impossible de repondre à la recherche");
- }
- }
- }
- return NULL;
- }
- //Thread initialisation de la communication principale entre client et serveur
- //Connexion utilisé pour traiter les requetes emise par le client
- void* tcp_cli_thread(void* data){
- Server s;
- //Cast data en serveur
- s = (Server) data;
- //Detache le thread
- if(pthread_detach(pthread_self()) != 0){
- return NULL;
- }
- //Boucle attente
- while(true){
-
- }
- return NULL;
- }
- //Thread initialisation de la communication utilisé par le serveur pour notifier les clients
- void* tcp_serv_thread(void* data){
- Server s;
- //Cast data en serveur
- s = (Server) data;
- //Detache le thread
- if(pthread_detach(pthread_self()) != 0){
- return NULL;
- }
- //Boucle attente
- while(true){
-
- }
- return NULL;
- }
- /* --- Fonctions publiques --- */
- void ini_server(){
- arraylist_ini(&get);
- arraylist_ini(&post);
- }
- void add_handler(char* method, char* ressource, int(*handler)(Server, JsonParser*)){
- if(strncmp(method, "POST", 5) == 0){
- arraylist_add(&post, ressource, handler);
- } else if(strncmp(method, "POST", 5) == 0){
- arraylist_add(&get, ressource, handler);
- }
- }
- boolean launch_udp_server(int port){
- Server s;
- pthread_t udp;
- //Creation serveur
- s = server_create_udp();
- if(s == NULL){
- addserror("Impossible de créer le serveur UDP");
- return false;
- }
- if(!s->server_bind(s, port)){
- addserror("Impossible de bind le serveur UDP");
- return false;
- }
- //Lancement thread serveur udp
- if(pthread_create(&udp, NULL, udp_thread, s) != 0){
- adderror("Impossible de créer le thread UDP");
- server_close(s);
- return false;
- }
- return true;
- }
- boolean launch_tcp_server(int port){
- Server s[2];
- pthread_t tcp;
- //Creation serveur
- s[0] = server_create_tcp();
- s[1] = server_create_tcp();
- if(s[0] == NULL || s[1] == NULL){
- addserror("Impossible de créer les serveurs TCP");
- return false;
- }
- if(!( s[0]->server_bind(s[0], port) && s[1]->server_bind(s[1], port + 1) )){
- addserror("Impossible de bind les serveurs TCP");
- return false;
- }
- //Lancement Thread attente connexion TCP
- if(pthread_create(&tcp, NULL, tcp_cli_thread, s[0]) != 0){
- adderror("Impossible de créer le thread TCP Client");
- server_close(s[0]);
- server_close(s[1]);
- return false;
- }
- if(pthread_create(&tcp, NULL, tcp_serv_thread, s[1]) != 0){
- adderror("Impossible de créer le thread TCP Serveur");
- server_close(s[0]);
- server_close(s[1]);
- return false;
- }
- return true;
- }
- boolean receive_client(Server);
- boolean send_client(Server, JsonEncoder*);
- boolean notify_client(Server, char*, char*, JsonEncoder*);
|