Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifdef __cplusplus
- #error Be sure you are using a C compiler...
- #endif
- #if defined (WIN32) || defined (_WIN32)
- #include <winsock2.h>
- #elif defined (linux) || defined (_POSIX_VERSION) || defined (_POSIX2_C_VERSION)\
- || defined (_XOPEN_VERSION)
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h> /* close */
- #define INVALID_SOCKET -1
- #define SOCKET_ERROR -1
- #define closesocket(s) close (s)
- typedef int SOCKET;
- typedef struct sockaddr_in SOCKADDR_IN;
- typedef struct sockaddr SOCKADDR;
- #else
- #error not defined for this platform
- #endif
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- /* macros ============================================================== */
- #define TELNET 23
- /* we want to listen to the TELNET port */
- #define PORT TELNET
- #define ESC 27
- /* constants =========================================================== */
- int nombre_de_clients = 0;
- /* types =============================================================== */
- /* structures ========================================================== */
- struct cli
- {
- pthread_t thread;
- SOCKADDR_IN sin;
- int recsize;
- SOCKET sock;
- int err;
- };
- struct player
- {
- char pseudo[16];
- char pseudo_alonged[32];
- int result;
- int place;
- };
- typedef struct player player;
- struct player_to //Liste des joueurs a trier -> BUFFER
- {
- char pseudo[16];
- int score;
- };
- struct player_to buffer_player[50];
- int bufferplace = 0;
- struct player scores[10];
- /* private data ======================================================== */
- /* private functions =================================================== */
- static void *wait_exit(void *p_data){
- char touche;
- do{
- if(kbhit()){
- touche = getch();
- } else {
- Sleep(100);
- }
- } while(touche != 27);
- WSACleanup ();
- exit(EXIT_SUCCESS);
- }
- static void *trier_scoreboard(void *p_data){
- int place = 0, i;
- while(1){
- if(place != bufferplace){
- place++;
- if(place > 49) { place = 0;}
- if(buffer_player[place].score > scores[9].result){
- if(buffer_player[place].score > scores[8].result){
- if(buffer_player[place].score > scores[7].result){
- if(buffer_player[place].score > scores[6].result){
- if(buffer_player[place].score > scores[5].result){
- if(buffer_player[place].score > scores[4].result){
- if(buffer_player[place].score > scores[3].result){
- if(buffer_player[place].score > scores[2].result){
- if(buffer_player[place].score > scores[1].result){
- if(buffer_player[place].score > scores[0].result){
- scores[9].result = scores[8].result;
- scores[8].result = scores[7].result;
- scores[7].result = scores[6].result;
- scores[6].result = scores[5].result;
- scores[5].result = scores[4].result;
- scores[4].result = scores[3].result;
- scores[3].result = scores[2].result;
- scores[2].result = scores[1].result;
- scores[1].result = scores[0].result;
- scores[0].result = buffer_player[place].score;
- strcpy(scores[9].pseudo, scores[8].pseudo);
- strcpy(scores[8].pseudo, scores[7].pseudo);
- strcpy(scores[7].pseudo, scores[6].pseudo);
- strcpy(scores[6].pseudo, scores[5].pseudo);
- strcpy(scores[5].pseudo, scores[4].pseudo);
- strcpy(scores[4].pseudo, scores[3].pseudo);
- strcpy(scores[3].pseudo, scores[2].pseudo);
- strcpy(scores[2].pseudo, scores[1].pseudo);
- strcpy(scores[1].pseudo, scores[0].pseudo);
- strcpy(scores[0].pseudo, buffer_player[place].pseudo);
- } else {
- scores[9].result = scores[8].result;
- scores[8].result = scores[7].result;
- scores[7].result = scores[6].result;
- scores[6].result = scores[5].result;
- scores[5].result = scores[4].result;
- scores[4].result = scores[3].result;
- scores[3].result = scores[2].result;
- scores[2].result = scores[1].result;
- scores[1].result = buffer_player[place].score;
- strcpy(scores[9].pseudo, scores[8].pseudo);
- strcpy(scores[8].pseudo, scores[7].pseudo);
- strcpy(scores[7].pseudo, scores[6].pseudo);
- strcpy(scores[6].pseudo, scores[5].pseudo);
- strcpy(scores[5].pseudo, scores[4].pseudo);
- strcpy(scores[4].pseudo, scores[3].pseudo);
- strcpy(scores[3].pseudo, scores[2].pseudo);
- strcpy(scores[2].pseudo, scores[1].pseudo);
- strcpy(scores[1].pseudo, buffer_player[place].pseudo);
- }
- } else {
- scores[9].result = scores[8].result;
- scores[8].result = scores[7].result;
- scores[7].result = scores[6].result;
- scores[6].result = scores[5].result;
- scores[5].result = scores[4].result;
- scores[4].result = scores[3].result;
- scores[3].result = scores[2].result;
- scores[2].result = buffer_player[place].score;
- strcpy(scores[9].pseudo, scores[8].pseudo);
- strcpy(scores[8].pseudo, scores[7].pseudo);
- strcpy(scores[7].pseudo, scores[6].pseudo);
- strcpy(scores[6].pseudo, scores[5].pseudo);
- strcpy(scores[5].pseudo, scores[4].pseudo);
- strcpy(scores[4].pseudo, scores[3].pseudo);
- strcpy(scores[3].pseudo, scores[2].pseudo);
- strcpy(scores[2].pseudo, buffer_player[place].pseudo);
- }
- } else {
- scores[9].result = scores[8].result;
- scores[8].result = scores[7].result;
- scores[7].result = scores[6].result;
- scores[6].result = scores[5].result;
- scores[5].result = scores[4].result;
- scores[4].result = scores[3].result;
- scores[3].result = buffer_player[place].score;
- strcpy(scores[9].pseudo, scores[8].pseudo);
- strcpy(scores[8].pseudo, scores[7].pseudo);
- strcpy(scores[7].pseudo, scores[6].pseudo);
- strcpy(scores[6].pseudo, scores[5].pseudo);
- strcpy(scores[5].pseudo, scores[4].pseudo);
- strcpy(scores[4].pseudo, scores[3].pseudo);
- strcpy(scores[3].pseudo, buffer_player[place].pseudo);
- }
- } else {
- scores[9].result = scores[8].result;
- scores[8].result = scores[7].result;
- scores[7].result = scores[6].result;
- scores[6].result = scores[5].result;
- scores[5].result = scores[4].result;
- scores[4].result = buffer_player[place].score;
- strcpy(scores[9].pseudo, scores[8].pseudo);
- strcpy(scores[8].pseudo, scores[7].pseudo);
- strcpy(scores[7].pseudo, scores[6].pseudo);
- strcpy(scores[6].pseudo, scores[5].pseudo);
- strcpy(scores[5].pseudo, scores[4].pseudo);
- strcpy(scores[4].pseudo, buffer_player[place].pseudo);
- }
- } else {
- scores[9].result = scores[8].result;
- scores[8].result = scores[7].result;
- scores[7].result = scores[6].result;
- scores[6].result = scores[5].result;
- scores[5].result = buffer_player[place].score;
- strcpy(scores[9].pseudo, scores[8].pseudo);
- strcpy(scores[8].pseudo, scores[7].pseudo);
- strcpy(scores[7].pseudo, scores[6].pseudo);
- strcpy(scores[6].pseudo, scores[5].pseudo);
- strcpy(scores[5].pseudo, buffer_player[place].pseudo);
- }
- } else {
- scores[9].result = scores[8].result;
- scores[8].result = scores[7].result;
- scores[7].result = scores[6].result;
- scores[6].result = buffer_player[place].score;
- strcpy(scores[9].pseudo, scores[8].pseudo);
- strcpy(scores[8].pseudo, scores[7].pseudo);
- strcpy(scores[7].pseudo, scores[6].pseudo);
- strcpy(scores[6].pseudo, buffer_player[place].pseudo);
- }
- } else {
- scores[9].result = scores[8].result;
- scores[8].result = scores[7].result;
- scores[7].result = buffer_player[place].score;
- strcpy(scores[9].pseudo, scores[8].pseudo);
- strcpy(scores[8].pseudo, scores[7].pseudo);
- strcpy(scores[7].pseudo, buffer_player[place].pseudo);
- }
- } else {
- scores[9].result = scores[8].result;
- scores[8].result = buffer_player[place].score;
- strcpy(scores[9].pseudo, scores[8].pseudo);
- strcpy(scores[8].pseudo, buffer_player[place].pseudo);
- }
- } else {
- scores[9].result = buffer_player[place].score;
- strcpy(scores[9].pseudo, buffer_player[place].pseudo);
- }
- }
- } else {
- Sleep(50);
- }
- }
- }
- static void *affichage(void *p_data){
- int i;
- while(1){
- for(i = 0; i < 10; i++){
- strcpy(scores[i].pseudo_alonged,scores[i].pseudo);
- while(16 > strlen(scores[i].pseudo_alonged)){
- strcat(scores[i].pseudo_alonged, " ");
- }
- }
- system("cls");
- printf("/-----------------------------------------------------------------------------\\\n");
- printf("| Echap pour quitter |\n");
- printf("| |\n");
- printf("| |\n");
- printf("| 421 Serveur - Alb & Gab |\n");
- printf("| |\n");
- printf("| |\n");
- printf("| |\n");
- printf("|-----------------------------------------------------------------------------|\n");
- printf("| |\n");
- printf("| Il y a : %d clients %s |\n", nombre_de_clients, nombre_de_clients > 9 ? "":" ");
- printf("| |\n");
- printf("| %der : %s -> %d %s |\n",scores[0].place,scores[0].pseudo_alonged,scores[0].result, scores[0].result > 9 ? "" : " ");
- for(i=1;i < 10; i++){
- 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 ? "" : " ");
- }
- printf("| |\n");
- printf("\\-----------------------------------------------------------------------------/\n");
- Sleep(2000);
- }
- }
- static void initscores(){
- int i, j = 0;
- for(i=0; i<10; i++){
- strcpy(scores[i].pseudo, "Null");
- scores[i].result = 0;
- scores[i].place = i + 1;
- }
- }
- /* thread client function */
- static void *client (void *p_data)
- {
- nombre_de_clients++;
- struct cli *p_cli = p_data;
- if (p_cli != NULL)
- {
- int end = 0;
- do
- {
- /* wait for the receive of a data block */
- unsigned char data[128];
- int sock_err = recv (p_cli->sock, data, (sizeof data - 1), 0);
- if (sock_err != SOCKET_ERROR)
- {
- size_t nb_rec = sock_err;
- if (nb_rec > 0)
- {
- /* convert to string */
- data[nb_rec] = 0;
- fflush (stdout);
- if (data[0] == ESC){
- end = 1;
- } else if (data != ESC){
- 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
- data[1] == 99 &&
- data[2] == 111 &&
- data[3] == 114 &&
- data[4] == 101 &&
- data[5] == 115 ){
- /* send some YES-TO-ALL answer */
- int i;
- char buff[128];
- for(i = 0; i < 10; i++){
- send(p_cli->sock, &scores[i], sizeof(player), 0);
- }
- } else {
- char data2[128];
- strcpy(data2, data);
- char* pseudo = strtok (data,":");
- char *scoree = data2 + (strlen(pseudo) + 1);
- bufferplace++;
- if(bufferplace > 49) { bufferplace = 0;}
- strcpy(buffer_player[bufferplace].pseudo, pseudo);
- buffer_player[bufferplace].score = atoi(scoree);
- }
- }
- }
- else
- {
- end = 1;
- }
- }
- else
- {
- p_cli->err = 1;
- end = 1;
- }
- }
- while (!end);
- shutdown (p_cli->sock, 2);
- closesocket (p_cli->sock), p_cli->sock = INVALID_SOCKET;
- /* the memory is now under the control of the thread */
- free (p_cli), p_cli = NULL;
- }
- nombre_de_clients--;
- return NULL;
- }
- static int clients (SOCKET sock)
- {
- int err = 0;
- int end = 0;
- do
- {
- {
- /* create a new client context */
- struct cli *p_cli = malloc (sizeof *p_cli);
- if (p_cli != NULL)
- {
- p_cli->recsize = (int) sizeof p_cli->sin;
- p_cli->sock =
- accept (sock, (SOCKADDR *) &p_cli->sin, &p_cli->recsize);
- if (p_cli->sock != INVALID_SOCKET)
- {
- /* send ...*/
- pthread_create (&p_cli->thread, NULL, client, p_cli);
- /* ... and forget */
- p_cli = NULL;
- }
- else
- {
- perror ("socket.accept");
- err = 1;
- }
- }
- else
- {
- fprintf (stderr, "client creation failed : memory error\n");
- }
- }
- }
- while (!end);
- return err;
- }
- /* ---------------------------------------------------------------------
- --------------------------------------------------------------------- */
- static int app (void)
- {
- int err = 0;
- /* open a socket in TCP/IP mode. */
- SOCKET sock = socket (AF_INET, SOCK_STREAM, 0);
- if (sock != INVALID_SOCKET)
- {
- //printf ("socket %d is now opened in TCP/IP mode\n", sock);
- /* we want to listen on the TELNET port */
- {
- int sock_err;
- /* assign the listening port */
- SOCKADDR_IN sin = { 0 };
- /* automatic IP address */
- sin.sin_addr.s_addr = htonl (INADDR_ANY);
- /* protocol family (IP) */
- sin.sin_family = AF_INET;
- /* listening port */
- sin.sin_port = htons (PORT);
- /* bind */
- sock_err = bind (sock, (SOCKADDR *) &sin, sizeof sin);
- if (sock_err != SOCKET_ERROR)
- {
- /* start listening (server mode) */
- sock_err = listen (sock, 5);
- if (sock_err != SOCKET_ERROR)
- {
- err = clients (sock);
- }
- else
- {
- err = 1;
- }
- }
- else
- {
- perror ("socket.bind");
- err = 1;
- }
- /* close the socket. */
- sock_err = closesocket (sock), sock = INVALID_SOCKET;
- if (sock_err)
- {
- perror ("socket.close");
- err = 1;
- }
- }
- }
- else
- {
- perror ("socket.open");
- err = 1;
- }
- return err;
- }
- /* entry point ========================================================= */
- /* ---------------------------------------------------------------------
- --------------------------------------------------------------------- */
- int main (void)
- {
- int ret;
- WSADATA wsa_data;
- int err = WSAStartup (MAKEWORD (2, 2), &wsa_data);
- pthread_t exit_t, aff_t, tri_t;
- pthread_create(&exit_t, NULL, wait_exit, NULL);
- pthread_create(&aff_t, NULL, affichage, NULL);
- pthread_create(&tri_t, NULL, trier_scoreboard, NULL);
- initscores();
- if (!err)
- {
- puts ("WIN: winsock2: OK");
- err = app ();
- WSACleanup ();
- }
- if (err)
- {
- ret = EXIT_FAILURE;
- }
- else
- {
- ret = EXIT_SUCCESS;
- }
- system ("pause");
- return ret;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement