bidulemax a écrit 5 commentaires

  • # J'AI TROUVE

    Posté par  . En réponse au message Serveur de tchat. Évalué à 1.

    En fait, faut pas mettre max+1 en premier argument de select, mais max_fd +1 donc, ça ne pouvait pas marcher, j'ai donc modifié pas mal de trucs, et la verstion finale sera bientot sur mon site (dès la prochaine mise a jours)

    http://coucou747.hopto.org(...)
  • [^] # Re: utorial sur les socket et 'select' en particulier

    Posté par  . En réponse au message Serveur de tchat. Évalué à 1.

    voila mon code, c'ets possible que je ne passe pas les bons arguments a DF_SET, en fait, le réseau, j'y comprends pas grand chose, la je code sans vraiment savoir ou sont les variables qui seront modifiés, "comme" quand on débute ... en faisant du copier coller de plusieurs programmes pour les réassembler en éspèrant obtennir qqch de bien ^^


    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <sys/wait.h>
    #include <sys/select.h>
    #include <sys/time.h>
    #include <unistd.h>

    #define MYPORT 1988

    #define NOMBREMAX 20

    typedef struct{
    char pseudo[20];
    int client_fd;
    } client;

    int envoi(int a, int b, char *chaine){
    int retour;
    retour=send(a, chaine, strlen(chaine), b);
    if (retour == -1){
    perror("send");
    close(a);
    }
    return retour;
    }

    int main(){
    char msg[4097];
    int len;
    int nombre=0, i, j, k;
    client tchateur[NOMBREMAX];
    struct sockaddr_in my_addr, their_addr;
    int sin_size;
    int serveur_fd;
    fd_set rfds;
    if ((serveur_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
    perror("socket");
    exit(1);
    }
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(MYPORT);
    my_addr.sin_addr.s_addr = INADDR_ANY;
    bzero(&(my_addr.sin_zero), 8);
    if (bind(serveur_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1){
    perror("bind");
    exit(1);
    }
    if ( listen(serveur_fd, NOMBREMAX)== -1){
    perror("listen");
    exit(1);
    }
    //recherche un nouveau pour se connecter
    sin_size = sizeof(struct sockaddr_in);
    while (1)
    {
    FD_ZERO(&rfds);
    FD_SET(serveur_fd,&rfds);
    for (i=0; i < nombre+1; i++)
    FD_SET(tchateur[i].client_fd,&rfds);
    printf("lancement de select\n");
    select(nombre+2, &rfds, NULL, NULL, NULL);
    if ( FD_ISSET(serveur_fd, &rfds)){
    //recherche un nouveau pour se connecter
    if ((tchateur[nombre].client_fd = accept(serveur_fd, (struct sockaddr *)&their_addr, &sin_size)) == -1){
    perror("accept");
    printf("ERREUR...\n");
    }
    printf("nouveau connecté...\n");
    envoi(tchateur[nombre].client_fd, 0, "\n\n\t\tBienvenu sur le serveur de Max\nListe des commandes :\n\tEXIT pour quitter.\n\tLISTE PSEUDO pour avoir la liste des personnes connectés\nPseudo : ");
    len = read(tchateur[nombre].client_fd, tchateur[nombre].pseudo, 19);
    tchateur[nombre].pseudo[19]=0;
    //finit le pseudo car si il est plus grand que 20 caractères alors il aurait été tronqué...
    nombre++; //un connecté de plus
    for (i=0; i<nombre-1; i++) //préviens tt le monde sauf le nouveau
    {
    envoi(tchateur[i].client_fd, 0, "Connexion de :");
    envoi(tchateur[i].client_fd, 0, tchateur[nombre-1].pseudo);
    }

    }
    for (i=0;i<nombre;i++){
    if (FD_ISSET(tchateur[i].client_fd,&rfds))
    {
    for (j=0; j<4097; j++)
    msg[j]=0;
    len = read(tchateur[i].client_fd, msg, 4096);
    if ( msg[0]==69 && msg[1]==88 && msg[2]==73 && msg[3]==84 && msg[3]==84 )
    { //Si la comende "EXIT" est tapée alors on déconnecte le client et on refraihit la liste
    close(tchateur[i].client_fd);
    printf("déconnexion de : %s", tchateur[i].pseudo);
    for (j=0;j<nombre;j++){ //préviens tt le monde que machin s'est déconnecté
    if (j!=i){ //i est déconnecté
    envoi(tchateur[j].client_fd, 0, "déconnexion de : ");
    envoi(tchateur[j].client_fd, 0, tchateur[i].pseudo);
    }
    }
    for (j=i; j<nombre-1; j++){ //refraichit la liste
    tchateur[j].client_fd=tchateur[j+1].client_fd;
    for (k=0;k<20;k++){
    tchateur[j].pseudo[k]=tchateur[j+1].pseudo[k];
    }
    }
    nombre--;
    }
    else if(msg[0]==76 && msg[1]==73 && msg[2]==83 && msg[3]==84 && msg[4]==69)
    { //Si "LISTE" est tapée alors
    for (j=0;j<nombre;j++){ //on affiche tt les pseudos
    envoi(tchateur[i].client_fd, 0, tchateur[j].pseudo);
    }
    }else{
    for ( j=0; j < nombre; j++) //envoi à tt le monde ce que i dit
    {
    if (j != i){ //mais ne l'envoi pas a i
    envoi(tchateur[j].client_fd, 0, tchateur[i].pseudo);
    envoi(tchateur[j].client_fd, 0, "\t");
    envoi(tchateur[j].client_fd, 0, msg);
    }
    }
    }
    }
    }
    }
    return 0;
    }
  • [^] # Re: utorial sur les socket et 'select' en particulier

    Posté par  . En réponse au message Serveur de tchat. Évalué à 1.

    je savais ce qui était bloquant (j'ai bossé pas mal de temps dessus, c'est mon premier programme réseau...) donc, il n'y a pas que accet, mais aussi read...

    Donc, maintenant mon problème est : il ne sort jamais de select, même si je me connecte au serveur...

    Donc, voila, même si je n'ai pas de messages d'erreurs à la complation, je suis toujours coincé ^^...

    merci pour ton tuto, je le lis la, et il a l'air plutot complète et bien expliqué bravo !
  • [^] # Re: Select

    Posté par  . En réponse au message Serveur de tchat. Évalué à 1.

    c'est FD_ZERO et pareil pour tt les fonctions...

    j'ai testé, mais ça marche toujours pas... je n'arrives pas a me connecter au serveur...
  • [^] # Re: Select

    Posté par  . En réponse au message Serveur de tchat. Évalué à 1.

    OK merci bcp, je renvois le code final dès que ça marche.
    ça devrait m'être très utile.