Advertisement
Aos_45

Serveur.c - Final

Feb 26th, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 21.10 KB | None | 0 0
  1. #ifdef __cplusplus
  2. #error Be sure you are using a C compiler...
  3. #endif
  4.  
  5. #if defined (WIN32) || defined (_WIN32)
  6.  
  7. #include <winsock2.h>
  8.  
  9. #elif defined (linux) || defined (_POSIX_VERSION) || defined (_POSIX2_C_VERSION)\
  10.  || defined (_XOPEN_VERSION)
  11.  
  12. #include <sys/types.h>
  13. #include <sys/socket.h>
  14. #include <netinet/in.h>
  15. #include <arpa/inet.h>
  16. #include <unistd.h>             /* close */
  17.  
  18. #define INVALID_SOCKET -1
  19. #define SOCKET_ERROR -1
  20.  
  21. #define closesocket(s) close (s)
  22. typedef int SOCKET;
  23. typedef struct sockaddr_in SOCKADDR_IN;
  24. typedef struct sockaddr SOCKADDR;
  25.  
  26. #else
  27. #error not defined for this platform
  28. #endif
  29.  
  30. #include <stdio.h>
  31. #include <stdlib.h>
  32.  
  33. #include <pthread.h>
  34.  
  35. /* macros ============================================================== */
  36.  
  37. #define TELNET 23
  38.  
  39. /* we want to listen to the TELNET port */
  40. #define PORT TELNET
  41.  
  42. #define ESC 27
  43.  
  44. /* constants =========================================================== */
  45. int nombre_de_clients = 0;
  46.  
  47. /* types =============================================================== */
  48. /* structures ========================================================== */
  49.  
  50. struct cli
  51. {
  52.    pthread_t thread;
  53.    SOCKADDR_IN sin;
  54.    int recsize;
  55.    SOCKET sock;
  56.    int err;
  57. };
  58.  
  59. struct player
  60. {
  61.     char pseudo[16];
  62.     char pseudo_alonged[32];
  63.     int result;
  64.     int place;
  65. };
  66. typedef struct player player;
  67.  
  68. struct player_to //Liste des joueurs a trier -> BUFFER
  69. {
  70.     char pseudo[16];
  71.     int score;
  72. };
  73.  
  74. struct player_to buffer_player[50];
  75. int bufferplace = 0;
  76. struct player    scores[10];
  77.  
  78. /* private data ======================================================== */
  79. /* private functions =================================================== */
  80.  
  81. static void *wait_exit(void *p_data){
  82.     char touche;
  83.     do{
  84.         if(kbhit()){
  85.             touche = getch();
  86.         } else {
  87.             Sleep(100);
  88.         }
  89.  
  90.     } while(touche != 27);
  91.  
  92.     WSACleanup ();
  93.  
  94.     exit(EXIT_SUCCESS);
  95. }
  96.  
  97. static void *trier_scoreboard(void *p_data){
  98.     int place = 0, i;
  99.     while(1){
  100.         if(place != bufferplace){
  101.             place++;
  102.             if(place > 49) { place = 0;}
  103.  
  104.             if(buffer_player[place].score > scores[9].result){
  105.                 if(buffer_player[place].score > scores[8].result){
  106.                     if(buffer_player[place].score > scores[7].result){
  107.                         if(buffer_player[place].score > scores[6].result){
  108.                             if(buffer_player[place].score > scores[5].result){
  109.                                 if(buffer_player[place].score > scores[4].result){
  110.                                     if(buffer_player[place].score > scores[3].result){
  111.                                         if(buffer_player[place].score > scores[2].result){
  112.                                             if(buffer_player[place].score > scores[1].result){
  113.                                                 if(buffer_player[place].score > scores[0].result){
  114.                                                     scores[9].result = scores[8].result;
  115.                                                     scores[8].result = scores[7].result;
  116.                                                     scores[7].result = scores[6].result;
  117.                                                     scores[6].result = scores[5].result;
  118.                                                     scores[5].result = scores[4].result;
  119.                                                     scores[4].result = scores[3].result;
  120.                                                     scores[3].result = scores[2].result;
  121.                                                     scores[2].result = scores[1].result;
  122.                                                     scores[1].result = scores[0].result;
  123.                                                     scores[0].result = buffer_player[place].score;
  124.                                                     strcpy(scores[9].pseudo, scores[8].pseudo);
  125.                                                     strcpy(scores[8].pseudo, scores[7].pseudo);
  126.                                                     strcpy(scores[7].pseudo, scores[6].pseudo);
  127.                                                     strcpy(scores[6].pseudo, scores[5].pseudo);
  128.                                                     strcpy(scores[5].pseudo, scores[4].pseudo);
  129.                                                     strcpy(scores[4].pseudo, scores[3].pseudo);
  130.                                                     strcpy(scores[3].pseudo, scores[2].pseudo);
  131.                                                     strcpy(scores[2].pseudo, scores[1].pseudo);
  132.                                                     strcpy(scores[1].pseudo, scores[0].pseudo);
  133.                                                     strcpy(scores[0].pseudo, buffer_player[place].pseudo);
  134.                                                 } else {
  135.                                                     scores[9].result = scores[8].result;
  136.                                                     scores[8].result = scores[7].result;
  137.                                                     scores[7].result = scores[6].result;
  138.                                                     scores[6].result = scores[5].result;
  139.                                                     scores[5].result = scores[4].result;
  140.                                                     scores[4].result = scores[3].result;
  141.                                                     scores[3].result = scores[2].result;
  142.                                                     scores[2].result = scores[1].result;
  143.                                                     scores[1].result = buffer_player[place].score;
  144.                                                     strcpy(scores[9].pseudo, scores[8].pseudo);
  145.                                                     strcpy(scores[8].pseudo, scores[7].pseudo);
  146.                                                     strcpy(scores[7].pseudo, scores[6].pseudo);
  147.                                                     strcpy(scores[6].pseudo, scores[5].pseudo);
  148.                                                     strcpy(scores[5].pseudo, scores[4].pseudo);
  149.                                                     strcpy(scores[4].pseudo, scores[3].pseudo);
  150.                                                     strcpy(scores[3].pseudo, scores[2].pseudo);
  151.                                                     strcpy(scores[2].pseudo, scores[1].pseudo);
  152.                                                     strcpy(scores[1].pseudo, buffer_player[place].pseudo);
  153.                                                 }
  154.                                             } else {
  155.                                                 scores[9].result = scores[8].result;
  156.                                                 scores[8].result = scores[7].result;
  157.                                                 scores[7].result = scores[6].result;
  158.                                                 scores[6].result = scores[5].result;
  159.                                                 scores[5].result = scores[4].result;
  160.                                                 scores[4].result = scores[3].result;
  161.                                                 scores[3].result = scores[2].result;
  162.                                                 scores[2].result = buffer_player[place].score;
  163.                                                 strcpy(scores[9].pseudo, scores[8].pseudo);
  164.                                                 strcpy(scores[8].pseudo, scores[7].pseudo);
  165.                                                 strcpy(scores[7].pseudo, scores[6].pseudo);
  166.                                                 strcpy(scores[6].pseudo, scores[5].pseudo);
  167.                                                 strcpy(scores[5].pseudo, scores[4].pseudo);
  168.                                                 strcpy(scores[4].pseudo, scores[3].pseudo);
  169.                                                 strcpy(scores[3].pseudo, scores[2].pseudo);
  170.                                                 strcpy(scores[2].pseudo, buffer_player[place].pseudo);
  171.                                             }
  172.                                         } else {
  173.                                             scores[9].result = scores[8].result;
  174.                                             scores[8].result = scores[7].result;
  175.                                             scores[7].result = scores[6].result;
  176.                                             scores[6].result = scores[5].result;
  177.                                             scores[5].result = scores[4].result;
  178.                                             scores[4].result = scores[3].result;
  179.                                             scores[3].result = buffer_player[place].score;
  180.                                             strcpy(scores[9].pseudo, scores[8].pseudo);
  181.                                             strcpy(scores[8].pseudo, scores[7].pseudo);
  182.                                             strcpy(scores[7].pseudo, scores[6].pseudo);
  183.                                             strcpy(scores[6].pseudo, scores[5].pseudo);
  184.                                             strcpy(scores[5].pseudo, scores[4].pseudo);
  185.                                             strcpy(scores[4].pseudo, scores[3].pseudo);
  186.                                             strcpy(scores[3].pseudo, buffer_player[place].pseudo);
  187.                                         }
  188.                                     } else {
  189.                                         scores[9].result = scores[8].result;
  190.                                         scores[8].result = scores[7].result;
  191.                                         scores[7].result = scores[6].result;
  192.                                         scores[6].result = scores[5].result;
  193.                                         scores[5].result = scores[4].result;
  194.                                         scores[4].result = buffer_player[place].score;
  195.                                         strcpy(scores[9].pseudo, scores[8].pseudo);
  196.                                         strcpy(scores[8].pseudo, scores[7].pseudo);
  197.                                         strcpy(scores[7].pseudo, scores[6].pseudo);
  198.                                         strcpy(scores[6].pseudo, scores[5].pseudo);
  199.                                         strcpy(scores[5].pseudo, scores[4].pseudo);
  200.                                         strcpy(scores[4].pseudo, buffer_player[place].pseudo);
  201.                                     }
  202.                                 } else {
  203.                                     scores[9].result = scores[8].result;
  204.                                     scores[8].result = scores[7].result;
  205.                                     scores[7].result = scores[6].result;
  206.                                     scores[6].result = scores[5].result;
  207.                                     scores[5].result = buffer_player[place].score;
  208.                                     strcpy(scores[9].pseudo, scores[8].pseudo);
  209.                                     strcpy(scores[8].pseudo, scores[7].pseudo);
  210.                                     strcpy(scores[7].pseudo, scores[6].pseudo);
  211.                                     strcpy(scores[6].pseudo, scores[5].pseudo);
  212.                                     strcpy(scores[5].pseudo, buffer_player[place].pseudo);
  213.                                 }
  214.                             } else {
  215.                                 scores[9].result = scores[8].result;
  216.                                 scores[8].result = scores[7].result;
  217.                                 scores[7].result = scores[6].result;
  218.                                 scores[6].result = buffer_player[place].score;
  219.                                 strcpy(scores[9].pseudo, scores[8].pseudo);
  220.                                 strcpy(scores[8].pseudo, scores[7].pseudo);
  221.                                 strcpy(scores[7].pseudo, scores[6].pseudo);
  222.                                 strcpy(scores[6].pseudo, buffer_player[place].pseudo);
  223.                             }
  224.                         } else {
  225.                             scores[9].result = scores[8].result;
  226.                             scores[8].result = scores[7].result;
  227.                             scores[7].result = buffer_player[place].score;
  228.                             strcpy(scores[9].pseudo, scores[8].pseudo);
  229.                             strcpy(scores[8].pseudo, scores[7].pseudo);
  230.                             strcpy(scores[7].pseudo, buffer_player[place].pseudo);
  231.                         }
  232.                     } else {
  233.                         scores[9].result = scores[8].result;
  234.                         scores[8].result = buffer_player[place].score;
  235.                         strcpy(scores[9].pseudo, scores[8].pseudo);
  236.                         strcpy(scores[8].pseudo, buffer_player[place].pseudo);
  237.                     }
  238.                 } else {
  239.                     scores[9].result = buffer_player[place].score;
  240.                     strcpy(scores[9].pseudo, buffer_player[place].pseudo);
  241.                 }
  242.             }
  243.         } else {
  244.             Sleep(50);
  245.         }
  246.     }
  247. }
  248.  
  249. static void *affichage(void *p_data){
  250.     int i;
  251.     while(1){
  252.         for(i = 0; i < 10; i++){
  253.             strcpy(scores[i].pseudo_alonged,scores[i].pseudo);
  254.             while(16 > strlen(scores[i].pseudo_alonged)){
  255.                 strcat(scores[i].pseudo_alonged, " ");
  256.             }
  257.         }
  258.  
  259.         system("cls");
  260.         printf("/-----------------------------------------------------------------------------\\\n");
  261.         printf("|    Echap pour quitter                                                       |\n");
  262.         printf("|                                                                             |\n");
  263.         printf("|                                                                             |\n");
  264.         printf("|                     421 Serveur - Alb & Gab                                 |\n");
  265.         printf("|                                                                             |\n");
  266.         printf("|                                                                             |\n");
  267.         printf("|                                                                             |\n");
  268.         printf("|-----------------------------------------------------------------------------|\n");
  269.         printf("|                                                                             |\n");
  270.         printf("|           Il y a : %d clients                   %s                            |\n", nombre_de_clients, nombre_de_clients > 9 ? "":" ");
  271.         printf("|                                                                             |\n");
  272.         printf("|           %der  : %s -> %d         %s                            |\n",scores[0].place,scores[0].pseudo_alonged,scores[0].result, scores[0].result > 9 ? "" : " ");
  273.         for(i=1;i < 10; i++){
  274.             printf("|           %de %s : %s -> %d                           %s          |\n", scores[i].place,scores[i].place != 10 ? " " : "", scores[i].pseudo_alonged,scores[i].result, scores[i].result > 9 ? "" : " ");
  275.         }
  276.         printf("|                                                                             |\n");
  277.         printf("\\-----------------------------------------------------------------------------/\n");
  278.         Sleep(2000);
  279.     }
  280. }
  281.  
  282. static void initscores(){
  283.     int i, j = 0;
  284.     for(i=0; i<10; i++){
  285.         strcpy(scores[i].pseudo, "Null");
  286.         scores[i].result = 0;
  287.         scores[i].place = i + 1;
  288.     }
  289.  
  290. }
  291.  
  292. /* thread client function */
  293.  
  294. static void *client (void *p_data)
  295. {
  296.    nombre_de_clients++;
  297.    struct cli *p_cli = p_data;
  298.    if (p_cli != NULL)
  299.    {
  300.       int end = 0;
  301.       do
  302.       {
  303.          /* wait for the receive of a data block */
  304.          unsigned char data[128];
  305.          int sock_err = recv (p_cli->sock, data, (sizeof data - 1), 0);
  306.  
  307.          if (sock_err != SOCKET_ERROR)
  308.          {
  309.             size_t nb_rec = sock_err;
  310.             if (nb_rec > 0)
  311.             {
  312.                /* convert to string */
  313.                data[nb_rec] = 0;
  314.                fflush (stdout);
  315.  
  316.                if (data[0] == ESC){
  317.                     end = 1;
  318.                } else if (data != ESC){
  319.                     if(data[0] == 83  && //Si la requette est score -- on controle bit a bit suite a des erreurs liées a du bit-flopping de fin de string
  320.                       data[1] == 99  &&
  321.                       data[2] == 111 &&
  322.                       data[3] == 114 &&
  323.                       data[4] == 101 &&
  324.                       data[5] == 115  ){
  325.                         /* send some YES-TO-ALL answer */
  326.                         int i;
  327.                         char buff[128];
  328.                         for(i = 0; i < 10; i++){
  329.                             send(p_cli->sock, &scores[i], sizeof(player), 0);
  330.                         }
  331.                     } else {
  332.                         char data2[128];
  333.  
  334.                         strcpy(data2, data);
  335.                         char* pseudo = strtok (data,":");
  336.                         char *scoree = data2 + (strlen(pseudo) + 1);
  337.  
  338.  
  339.                         bufferplace++;
  340.                         if(bufferplace > 49) { bufferplace = 0;}
  341.                         strcpy(buffer_player[bufferplace].pseudo, pseudo);
  342.                         buffer_player[bufferplace].score = atoi(scoree);
  343.                     }
  344.                }
  345.             }
  346.             else
  347.             {
  348.                end = 1;
  349.             }
  350.          }
  351.          else
  352.          {
  353.             p_cli->err = 1;
  354.             end = 1;
  355.          }
  356.       }
  357.       while (!end);
  358.  
  359.       shutdown (p_cli->sock, 2);
  360.       closesocket (p_cli->sock), p_cli->sock = INVALID_SOCKET;
  361.       /* the memory is now under the control of the thread */
  362.       free (p_cli), p_cli = NULL;
  363.  
  364.    }
  365.     nombre_de_clients--;
  366.    return NULL;
  367. }
  368.  
  369. static int clients (SOCKET sock)
  370. {
  371.     int err = 0;
  372.     int end = 0;
  373.     do
  374.     {
  375.         {
  376.          /* create a new client context */
  377.          struct cli *p_cli = malloc (sizeof *p_cli);
  378.          if (p_cli != NULL)
  379.          {
  380.             p_cli->recsize = (int) sizeof p_cli->sin;
  381.             p_cli->sock =
  382.                accept (sock, (SOCKADDR *) &p_cli->sin, &p_cli->recsize);
  383.  
  384.             if (p_cli->sock != INVALID_SOCKET)
  385.             {
  386.                /* send ...*/
  387.                pthread_create (&p_cli->thread, NULL, client, p_cli);
  388.                /* ... and forget */
  389.                p_cli = NULL;
  390.  
  391.             }
  392.             else
  393.             {
  394.                perror ("socket.accept");
  395.                err = 1;
  396.             }
  397.          }
  398.          else
  399.          {
  400.             fprintf (stderr, "client creation failed : memory error\n");
  401.          }
  402.       }
  403.    }
  404.    while (!end);
  405.    return err;
  406. }
  407.  
  408. /* ---------------------------------------------------------------------
  409.    --------------------------------------------------------------------- */
  410. static int app (void)
  411. {
  412.    int err = 0;
  413.  
  414.    /* open a socket in TCP/IP mode. */
  415.    SOCKET sock = socket (AF_INET, SOCK_STREAM, 0);
  416.  
  417.    if (sock != INVALID_SOCKET)
  418.    {
  419.       //printf ("socket %d is now opened in TCP/IP mode\n", sock);
  420.  
  421.       /* we want to listen on the TELNET port */
  422.       {
  423.          int sock_err;
  424.          /* assign the listening port */
  425.          SOCKADDR_IN sin = { 0 };
  426.  
  427.          /* automatic IP address */
  428.          sin.sin_addr.s_addr = htonl (INADDR_ANY);
  429.  
  430.          /* protocol family (IP) */
  431.          sin.sin_family = AF_INET;
  432.  
  433.          /* listening port */
  434.          sin.sin_port = htons (PORT);
  435.  
  436.          /* bind */
  437.          sock_err = bind (sock, (SOCKADDR *) &sin, sizeof sin);
  438.  
  439.          if (sock_err != SOCKET_ERROR)
  440.          {
  441.             /* start listening (server mode) */
  442.             sock_err = listen (sock, 5);
  443.  
  444.             if (sock_err != SOCKET_ERROR)
  445.             {
  446.                err = clients (sock);
  447.             }
  448.             else
  449.             {
  450.                err = 1;
  451.             }
  452.          }
  453.          else
  454.          {
  455.             perror ("socket.bind");
  456.             err = 1;
  457.          }
  458.  
  459.          /* close the socket. */
  460.          sock_err = closesocket (sock), sock = INVALID_SOCKET;
  461.  
  462.          if (sock_err)
  463.          {
  464.             perror ("socket.close");
  465.             err = 1;
  466.          }
  467.       }
  468.    }
  469.    else
  470.    {
  471.       perror ("socket.open");
  472.       err = 1;
  473.    }
  474.  
  475.    return err;
  476. }
  477.  
  478. /* entry point ========================================================= */
  479.  
  480. /* ---------------------------------------------------------------------
  481.    --------------------------------------------------------------------- */
  482. int main (void)
  483. {
  484.    int ret;
  485.    WSADATA wsa_data;
  486.    int err = WSAStartup (MAKEWORD (2, 2), &wsa_data);
  487.  
  488.     pthread_t exit_t, aff_t, tri_t;
  489.     pthread_create(&exit_t, NULL, wait_exit, NULL);
  490.     pthread_create(&aff_t, NULL, affichage, NULL);
  491.     pthread_create(&tri_t, NULL, trier_scoreboard, NULL);
  492.     initscores();
  493.  
  494.  
  495.    if (!err)
  496.    {
  497.       puts ("WIN: winsock2: OK");
  498.  
  499.  
  500.       err = app ();
  501.  
  502.  
  503.       WSACleanup ();
  504.    }
  505.  
  506.    if (err)
  507.    {
  508.       ret = EXIT_FAILURE;
  509.    }
  510.    else
  511.    {
  512.       ret = EXIT_SUCCESS;
  513.    }
  514.  
  515.    system ("pause");
  516.  
  517.    return ret;
  518. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement