N-PN White-Hat Project
[C] Serveur multi-clients - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Programmation (https://dev.n-pn.fr/forum/forumdisplay.php?fid=72)
+--- Forum : Langages compilés (https://dev.n-pn.fr/forum/forumdisplay.php?fid=25)
+--- Sujet : [C] Serveur multi-clients (/showthread.php?tid=2248)



[C] Serveur multi-clients - Creepy_p0ney - 07-10-2012

Bonjour, je cherche à programmer un serveur multiclient en C fonctionnant avec les threads de sorte de faire un tchat sur mon réseau local après, mais je n'y arrive pas je ne comprends pas trop.

merci d'avance


RE: serveur multiclients - ark - 07-10-2012

Hum... Ça te dirais de donner plus d'infos ? x)
Du genre, tu code dans quel langage, ou est ce que tu bloque exactement,... ?


RE: serveur multiclients - Swissky - 07-10-2012

http://www.cppfrance.com/codes/LOGICIEL-CHAT-RESEAUX-LOCAL_22779.aspx
http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=5722&lngWId=1
http://files.codes-sources.com/fichier.aspx?ID=54135

il parait que Google donne de bons résultats Wink
Ta du C++ et du JAva et VB6 dans les liens plus haut Tongue


RE: serveur multiclients - Creepy_p0ney - 07-10-2012

Ark : je code en c, je bloques sur l'acceptation des differents clients et la création du thread


RE: serveur multiclients - ark - 07-10-2012

Bah, pas grands chose a dire quoi: DOC ! Big Grin

http://franckh.developpez.com/tutoriels/posix/pthreads/
http://broux.developpez.com/articles/c/sockets/

C'est cadeau, ca me fait plaisir Big Grin
Bon courage !


RE: serveur multiclients - Commodor - 07-10-2012

Évite les threads Big Grin
essaye de regarder la fonction Select Wink Si tu bloques à certains endroits n'hésite pas Wink J'ai également fait un chat pour m’exercer et c'est plutôt enrichissant pour mieux cerner les sockets Smile


RE: serveur multiclients - Creepy_p0ney - 08-10-2012

T'as fait un tchat ? tu pourras me passer le code source s'il te plaît (si c'est un code comprehensible), sinon t'as fait quoi avec les sockets ?


RE: serveur multiclients - Commodor - 08-10-2012

je vais fouiller dans mon bordel mais il ne sera pas compréhensible si tu n'as pas vu la fonction select Smile j'essaye de le poster mercredi Wink

Pour ce coup-ci, il est plus intéressant que tu découvres la fonction select par toi même (developpez.net) plutôt que d'essayer de comprendre et recopier une source :p

j'ai pas fait grand chose d'autre. Tout se base sur ce 'tchat'. Sauf qu'à la place d'envoyer des messages le programme effectue certaines actions demandées par le client (comme exécuter des commandes quand je voulais administrer mon système à distance. Même s'il existe d’excellents moyens de le faire sans recorder une app (ssh par ex), le faite de le faire était plutôt enrichissant) Wink

tu verras si tu veux faire un 'tchat' en console, tu auras quelques contraintes plutôt chiantes :p mais je pourrais t'aiguiller sur la meilleurs solution qui me semble la plus approprié


RE: serveur multiclients - Creepy_p0ney - 08-10-2012

ç doit être planqué dans ton commodor (désolé je mouurais d'envie de faire cette blague), Ouais j'ai trouvé un tuto sur le sdz avec la func select, parce que en fait j'adore le réseau et tout ça du coup je veux un peu apprendre à tout utiliser avec un langage.


RE: serveur multiclients - Commodor - 08-10-2012

^^ on me l'avait jamais faite :p

Le tuto sur le sdz est pas trop complet à ce niveau là...

L'utilisation des sockets est vraiment bien quand on la maitrise (je suis très loin de savoir l'utiliser Rolleyes )


RE: serveur multiclients - Dobry - 08-10-2012

Si je devais conseiller UN lien pour les sockets en C/C++ ca serait http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html, mis à jour avec la venue de l'IPV6, le code est valide fonctionne parfaitement et te montre la "bonne" façon de faire un programme utilisant les sockets (je dis ca, car souvent les programmes "tout fait" trouvé sur google datent un peu et ne le font pas forcement d'une manière très efficace par rapport au fonctions dont on dispose ajourd'hui.


RE: serveur multiclients - Commodor - 08-10-2012

Ha merci c'est toujours bon à prendre Blush


RE: serveur multiclients - Creepy_p0ney - 09-10-2012

Le lien que tu asdonné est mort, mais je l'ai déjà lu donc c'est pas grâve donc voilà où j'en suis
Code :
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
typedef struct
{
   int sock;
   char name[64];
}Client;
int main(){
    
    
    int reals;
    int sin_size;
    int sockfd;
    struct sockaddr_in their_addr[5];
    int i=0;
    int ret=0;
    char buf[64];
    char *pass[5];
    char *pseudo[5];
    char msg[64];
    int k=0;
    int m=0;
    int max=0;
    Client clients[5];
    fd_set fd;
    fd_set cfd;
    struct sockaddr *addr;
    char *log="tim";
    struct sockaddr_in my_addr;
    pid_t pid;
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
        perror("socket");
        exit(1);
    }
    my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(2300);
    my_addr.sin_addr.s_addr=INADDR_ANY;
    
    if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr_in))<0){
        perror("bind");
        exit(1);
    }
    listen(sockfd,5);
    printf("attente d'un client");
    sin_size = sizeof(struct sockaddr_in);
    printf("%d\n",i);
    while(1){
        int l=0;
        int n=0;
        
        FD_ZERO(&fd);
        FD_SET(sockfd,&fd);
        for(l=0;l<=i;l++){
            FD_SET(clients[l].sock,&fd);
        }
        printf("nous y sommes3\n");
        for(n=0;n<=i;n++){
            if(max<clients[n].sock){
                max=clients[n].sock;
            }
        }
        if(max<sockfd)
            max=sockfd;
        printf("%d",max);
        if((ret=select(max,&fd,NULL,NULL,NULL))==-1){
            perror("select");
            exit(1);
        }
        printf("nous y sommes2\n");
        if(FD_ISSET(sockfd,&fd)){
            printf("here we are\n");
            sin_size=sizeof(struct sockaddr_in);
            clients[i].sock=accept(sockfd,(struct sockaddr *)&their_addr[i],&sin_size);
            send(clients[i].sock,"login :",64,0);
            reals=recv(clients[i].sock,buf,64,0);
            buf[reals]='\0';
            strncpy(clients[i].name, buf, 64 - 1);            
            i++;
            
        }
        else if(ret==0){
            printf("problem?");
        }
        else{
            printf("here we are9");
            for(k=0;k<=i;k++){
                if(FD_ISSET(clients[k].sock,&fd)){
                    int j=0;
                    printf("here we are5\n");
                    reals=recv(clients[k].sock,buf,64,0);
                    printf("here we are6\n");
                    if(reals==0){
                        close(clients[k].sock);
                        i--;
                    }    
                    else{    
                        buf[reals]='\0';
                        printf("%s",buf);
                        printf("here we are7\n");
                        strncpy(msg,clients[k].name,64-1);
                        strncat(msg,buf,64-strlen(msg)-1);
                        printf("here we are8\n");
                        for(j=0;j<=i;j++){
                            send(clients[j].sock,msg,64,0);
                        }
                    }
                }
            }
        }

    }        
        


    
}
je galere avec les pseudos donc j'ai fait comme ça (c'est pas grâve comme c'est en local)
*edit j'ai réussi pour les pseudos, mais y'a quelques gros bugs (peut être parce que je test 2 clients sur le même pc) maissi t'as ton code commodor je le veux bien