La Ferme du web - Les forums

Venez baraguiner avec la communauté !

Vous n'êtes pas identifié.

#1 29/12/2009 14:44:41

nagadscar
Membre
Date d'inscription: 20/11/2009
Messages: 7

serveur de base, code et explications

Alors voila, je vais maintenant vous mettre le code source d'un serveur de base, trés simple en c   (le code marche aussi en c++). Ce serveur ne fait qu'accepter une connexion et lorsqu'il recoit une trame, il la retransmet à tous les clients.

CODE :

#include <stdlib.h>
#include <winsock2.h>
#include <string.h>
#include <stdio.h>
#include <pthread.h> //nécessite pthreadGC2.dll


#define PORT 8080 // Port arbitraire de communication
int tab[50]; // tableau d'entier permettant de stocker les numéros de socket des clients
int longtab;// entier indiquant le nombre de client
int end;// entier permettant de fermer le serveur

SOCKET sSock;

/**---------------[initialisation des winsock]---------------**/
void init()
{
     WORD wVersionRequested;
     WSADATA wsaData;
     wVersionRequested = MAKEWORD(1, 1);
     if (WSAStartup(wVersionRequested, &wsaData))
     {
     printf("Erreur WSAStartup \n") ;
     system("PAUSE") ;
     exit(1) ;
     }
}

/**---------------[envoi de la trame à tous les clients]---------------**/
void EnvoiTousClient(char * buffer)
{
    int i = 0;
    for( i = 0 ; i < longtab ; i++ )
        send(tab[i] , buffer , strlen(buffer) , 0);
}

/**---------------[méthode principale]---------------**/
int run(int sock)
{
    char Buffer[500];
    char tmp[500];
    int i;
    do
    {
        if(recv(sock, Buffer, 500, 0) != SOCKET_ERROR)
        {
            strcpy(tmp,Buffer);
            EnvoiTousClient(Buffer);
            for( i = 0 ; i<500 ; i++)
                Buffer[i] = '\0';
                printf(">%s\n",tmp);
        }

    }while(strcmp(tmp, "/quit") != 0);
    return sock;
}

/**---------------[petit panel d'admin, en console]---------------**/
void thr_main( int fake )
{
    int choix = 0;
    int sortie = 0;
    char Buff[500];
    while (sortie == 0)
    {
        printf("\t\tPanel\n");
        printf("1 - listage des clients\n");
        printf("2 - fermeture du serveur\n");
        printf("3 - send mess\n");
        scanf("%d",&choix);
        switch(choix)
        {
            case 1 : printf("il y a %d client\n", longtab);system("pause");system("cls");break;
            case 2 : sortie = 1;end = 1; break;
            case 3 : printf("trame a envoyer > ");scanf("%s" , Buff);EnvoiTousClient(Buff);break;
            default :break;
        }
    }
}

int main()
{
    int fromlen = sizeof(struct sockaddr_in);
    int tSock;
    int tmp;
    init();
    longtab = 0;
    pthread_t thr;
    end = 0;
    sSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if( sSock!=INVALID_SOCKET )
    {
        struct sockaddr_in sain;
        sain.sin_family = AF_INET;
        sain.sin_port = htons(PORT);
        sain.sin_addr.s_addr = INADDR_ANY;
        if(bind(sSock, (struct sockaddr *) &sain, sizeof(struct sockaddr_in)) != SOCKET_ERROR)
        {
            if (listen(sSock, 1)!=SOCKET_ERROR)
            {
                pthread_create(&thr , NULL , thr_main , 0);
                while(!end)
                {
                    tab[longtab] = accept(sSock,(struct sockaddr *) &sain, &fromlen);
                    if(tab[longtab]==SOCKET_ERROR)
                    {
                        printf("erreur d'acceptation\n");
                        system("PAUSE") ;
                        closesocket(tab[longtab]);
                    }
                    tSock = pthread_create(&thr , NULL , run , tab[longtab]);
                    longtab++;
                }
            }
            else
            {
                printf("ERREUR LISTEN \n");
                system("PAUSE") ;
                closesocket(sSock);
            }
        }
        else
        {
            printf("erreur bind\n");
            closesocket(sSock);
        }
    }
    else
    {
        printf("ERREUR SOCKET\n");
    }

    int i;
    if( end == 1)
    {
        for( i = 0 ; i < longtab ; i++ )
            closesocket(tab[i]);           
        WSACleanup();
    }
    else
    {

        printf("un client nous quit, paix à son ame\n");
        for( i = 0 ; tab[i] != tSock ; i++);
        for( i ; i < longtab ; i++ )
            tab[i] = tab[i+1];
        longtab--;
        closesocket(tSock);
    }
    return 1;
}

ATTENTION : CE CODE NE FONCTIONNE QUE SOUS WINDOWS, IL NECESSITE le dll du thread , ET PRENEZ EN COMPTE QUE J AI MODIFIER LE CODE AVANT DE VOUS LE TRANSMETTRE DONC IL N EST PAS TESTE (mais normalement il n'a pas de problemes)

en cas de soucis, laissez un message ou envoyez un mp !

Hors ligne

 

29/12/2009 14:44:41

Botte De Foin Publicitaire


#2 29/12/2009 14:50:56

nagadscar
Membre
Date d'inscription: 20/11/2009
Messages: 7

Re: serveur de base, code et explications

je mettrai bientot le code du client=)

Hors ligne

 

#3 29/12/2009 15:57:12

DJo
Administrateur
Date d'inscription: 31/07/2008
Messages: 569
Site web

Re: serveur de base, code et explications

Haha, tu t'éclate bien !

Hors ligne

 

#4 30/12/2009 11:21:05

nagadscar
Membre
Date d'inscription: 20/11/2009
Messages: 7

Re: serveur de base, code et explications

héhé ouai mais de toutes facons je dois le faire, j'ai un p2p à faire pour les cours ^^

Hors ligne

 

Pied de page des forums

Powered by FluxBB
© Copyright 2008-2009 - LaFermeduWeb.net