IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

problème serveur et multiclient


Sujet :

Réseau C

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut problème serveur et multiclient
    Bonjour j ai un petit souci de serveur TCP sous linux

    C est un serveur de calcul assez simple qui marchait sans problème jusqu a ce que j inclue un fork.En effet une fois qu un client se connecte j ai le message suivant sur le serveur:
    -succes

    Mais si un deuxieme client se connecte j ai le message suivant:
    -illegal seek

    Que signifie ce message?

    Malgré tous les deux client peuvent travailler sans probleme un eptit moment mais au bout d'un moment chaque client reçoit n importe quel information du serveur.
    Par exemple un client reçoit le resultat d'un calcul d'un autre client.

    J ai fais mes essais en local.Je ne peux pas mettre intégralement mon code parce que j'utilise des fonction inclu dans d autre fichier mais je vais mettre la partie definition des données et le fork.

    Je pense que toutes ces erreurs sont dues à une mauvaise utilisation du fork.
    Voici le code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
     
     int main()
     {      	
     
     
     
     
    	int sock = socket(AF_INET, SOCK_STREAM, 0);
            int ok=1;
            struct sockaddr_in serv;
            serv.sin_family = AF_INET;
            serv.sin_port = htons(1234);
            serv.sin_addr.s_addr = INADDR_ANY;
     
            if (bind(sock,(struct sockaddr*)&serv,sizeof(serv)) != 0)
            {
                    perror("Bind");
                    return(0);
            }
            if (listen(sock, 20) != 0)
            {
                    perror("Listen");
                    return(0);
            }
     
     
     
          while(1)
          {
             sock_com=accept(sock,(struct sockaddr*)0,(int*)0);
               if (sock_com==-1)
                {
                  perror("ERREUR ACCEPTE");
                   return(-1);
                 }
               else
              {
             perror("bravo connexion etablie");
     
               }
     
     
           int x=fork();
           if(x==-1)printf("impossible fork\n");
     
     
             if(x!=0)
             {
     
    	close(sock_com);
             }
     
     
              if (x==0)
             {
                  printf("on est dans le fils\n");
     
     
     
     
     
                    while(boucle==0)
                    {
    	          */traitement des requetes du client*/
                    }
              }
     
          }
     return 0;
    }
    Je ne sais pas si ce code servira des masses mais je voulais savoir si mon fork etait bien placé et que signifiat ce message "illegal seek".

    merci beaucoup d'avance

  2. #2
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Pour la gestion des multi client je te sugérerai plutôt les thread (ou des groupe de thread -> pool threading) Pour la gestion des descripteurs de fichiers poll() ou select().

    Désolé pour ton message d'erreure je ne sais pas je suppose que c'est un probleme de descripteur de fichier, peut être le close ?

  3. #3
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Pour programmer les sockets il faut effectivement utiliser les threads ; curieusement lPara-Bol ne voulait pas entendre parler dans son projet

  4. #4
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Citation Envoyé par Mat.M
    Pour programmer les sockets il faut effectivement utiliser les threads ; curieusement lPara-Bol ne voulait pas entendre parler dans son projet
    Evidement, mon server n'est pas en streaming et n'a donc aucunement besoin de thread... Les threads sont utilent si il ya besoin d'échanger de grosses données pour eviter de bouchonner...

    Et non il n'est pas impératif donc d'utiliser plusieur processus que ce soit fork ou thread si le traitement des données est relativement rapide Mais tu peux toujours venir http://ace.lya.eu tu veras la bonne efficacité Et voici le shema de fonctionnement : http://ace.lya.eu/ace.png

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    ouki merci mais je ne peux aps utiliser les thread les fork() sont imposé par le sujet

  6. #6
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Salut, je ne suis pas un pro de l' ajax ammoniaqué, mais essayes de fermer le socket d' écoute uniquement si le fork réussit.

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
             if(x!=0)
             {
     
    	close(sock_com);
             }
    mais c est ce que je fais non?

  8. #8
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Citation Envoyé par |PaRa-BoL
    Evidement, mon server n'est pas en streaming et n'a donc aucunement besoin de thread... Les threads sont utilent si il ya besoin d'échanger de grosses données pour eviter de bouchonner...
    D'accord bien compris mais on attend de voir quand tu auras plusieurs connections simultanées et que l'échange de données sera conséquent...


  9. #9
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    D'accord bien compris mais on attend de voir quand tu auras plusieurs connections simultanées et que l'échange de données sera conséquent...
    Ce n'est pas le bon sujet pour parler de ca xD

    Mais cela dit j'ai testé avec une 200 connections et toujours pas de problème et il ne peut pas yavoir d'envoi conséquent.
    Mon traitement des données ne dépasse pas les 150 microsecondes :/ (Et oui encore une fois c'est pas du streaming xD)

  10. #10
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    euh une tite question avec els processus loursd on peut faire combien de connexion?
    Autant que la mémoire de l'ordinateur serveur en accepte par rapport à la mémoire ou autant que dans la file d'attente de la socket?

  11. #11
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Heu autant que le nombre maximum d'un integer ? xD

  12. #12
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par sneb5757
    Bonjour j ai un petit souci de serveur TCP sous linux

    Mais si un deuxieme client se connecte j ai le message suivant:
    -illegal seek

    Que signifie ce message?

    merci beaucoup d'avance
    cela signifie que votre code essaye de déplacer la position de lecture dans un stream qui n'est pas lié à un fichier sur un device à accès aléatoire…

    ce qui est évidemment le cas d'un stream de bytes venant d'un socket lié à un port réseau…

    même si vous n'avez pas de "seek" ou "rewind" dans votre propre code,
    cela peut arriver si vous passez le descripteur du fichier à une fonction qui n'est pas prévue pour travailler sur ce genre de stream…
    et cela peut aussi être la conséquence d'une mauvaise gestion des descripteurs suite au fork()…

  13. #13
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonsoir,

    Citation Envoyé par sneb5757
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
     
     int main()
     {      	
     
     
     
     
    	int sock = socket(AF_INET, SOCK_STREAM, 0);
            int ok=1;
            struct sockaddr_in serv;
            serv.sin_family = AF_INET;
            serv.sin_port = htons(1234);
            serv.sin_addr.s_addr = INADDR_ANY;
     
            if (bind(sock,(struct sockaddr*)&serv,sizeof(serv)) != 0)
            {
                    perror("Bind");
                    return(0);
            }
            if (listen(sock, 20) != 0)
            {
                    perror("Listen");
                    return(0);
            }
     
     
     
          while(1)
          {
             sock_com=accept(sock,(struct sockaddr*)0,(int*)0);
               if (sock_com==-1)
                {
                  perror("ERREUR ACCEPTE");
                   return(-1);
                 }
               else
              {
             perror("bravo connexion etablie");
     
               }
     
     
           int x=fork();
           if(x==-1)printf("impossible fork\n");
     
     
             if(x!=0)
             {
     
    	close(sock_com);
             }
     
     
              if (x==0)
             {
                  printf("on est dans le fils\n");
     
     
     
     
     
                    while(boucle==0)
                    {
    	          */traitement des requetes du client*/
                    }
              }
     
          }
     return 0;
    }
    Pourquoi ouvrire la socket avant le fork si c'est pour la fermer dans le fil ? Autant l'ouvrir après le fork, uniquement dans le processus père.

Discussions similaires

  1. problème serveur IIS
    Par oumar-abj dans le forum IIS
    Réponses: 2
    Dernier message: 09/11/2006, 11h10
  2. problème serveur Zope at home
    Par t_om84 dans le forum Zope
    Réponses: 1
    Dernier message: 06/10/2006, 00h04
  3. [MySQL]Problème serveur embarqué !!
    Par julio_boss dans le forum Bases de données
    Réponses: 2
    Dernier message: 10/05/2006, 11h31
  4. Réponses: 1
    Dernier message: 27/10/2005, 11h14
  5. Problème serveur Posgresql : recuperation anciennes requêtes
    Par petitmoosse dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 04/12/2004, 18h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo