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 :

Probleme Serveur/Multi-client avec socket


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut Probleme Serveur/Multi-client avec socket
    bonjour, il m'arrive un petit soucis dans le cadre d'une application client/serveur via socket.

    En éffet, pour mon application le serveur execute tous le temps la meme tache dès lors qu'un client se connecte.
    Il lit les données du client, les écrit puis ferme la connexion.
    Le client lui se connecte au serveur, envoi ses données et ferme la connexion.

    Pour une seule utilisation tout fonctionne parfaitement. Seulement j'ai besoin que mon serveur accepte plusieurs connexions a tout moment, et qu'il execute sa tache a chaque client connectée.

    J'ai donc opté pour une boucle sur le serveur qui répète : socket - bind - listen - accept - synchro - recv - shutdown RW - close
    Le client lui est du type : socket - connect - synchro - send - shutdown RW - close

    La phase de sychro est un simple envoi de message du type ping/pong.

    Lorsque je connecte mon client pour la première fois, l'ensemble fonctionne, mais une fois terminé, je boucle sur le serveur (ce que je souhaite) mais une erreur survient lors de bind.

    Je ne sais pas quoi faire ? je ne suis pas sûr que la boucle soit la meilleure solution premièrement, sinon existe t-il une fonction qui purge un port (en gros le libère) puisque je suppose que bind faillie a cause du port probablement pas libre.

    Voila c'est plus une question d'algorithmique que de programmation pure, j'espère que vous m'aiderez, en tout cas je vous remercie d'avance pour avoir prie le temps de me lire


    Merci

  2. #2
    Membre régulier Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Points : 120
    Points
    120
    Par défaut
    Lorsqu'un nouveau client se connecte il ne faut pas refaire appel à toutes les fonctions d'initialisation!
    Tout reste identique jusqu'à accept(). Ton accept() doit se situer dans une boucle "infinie" ( while(1) ), quand un client se connecte alors appelle la fonction qui créer un nouveau thread et donne lui en paramètre le socket récupéré avec accept. En gros ça doit ressembler à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while(1){
            sock_client = accept(...);
            if(sock_client > -1)
                    createThread(sock);
            else
                    puts("error");
    }
    Ainsi ton thread principal, celui qui vérifie la connexion de nouveau client est toujours actif, et pour chaque client un nouveau thread est créé.
    Mon blog: http://blog.bores.fr
    Mon wiki: http://bores.fr/wiki
    Mes programmes libres: https://github.com/tbores

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Voila j'ai donc fait ce qu'il fallait, le probleme est que dans la boucle il accepte les connexions venant de la socket -1. Enfait dès qu'un client se connecte tout s'effectue comme il faut sauf qu'il boucle en me disant qu'un client se connecte avec la socket -1. Or si je teste la socket > -1 là il me dit qu'un client se connecte mais il ne lance pas le thread...

    Que faire? je peux vous poster un bout de code mais je programme sur psp (mips r4000)
    (quoiqu'il n'y a pas grand changement avec linux enfait, simplement le nom des fonctions qui change un peu, et quelques subtilités)

  4. #4
    Membre régulier Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Points : 120
    Points
    120
    Par défaut
    Heu oui donne ton code , car là je n'ai pas tout compris ce que tu as dit.
    Je ne savais pas qu'on pouvais programmé pour la psp, y a moyen de faire des trucs intéressant avec? Ca va peut être me donné envie de l'acheté :p
    Mon blog: http://blog.bores.fr
    Mon wiki: http://bores.fr/wiki
    Mes programmes libres: https://github.com/tbores

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Sur la psp on peut programmer en C/C++, elle gere a peu près tout, elle a une sorte de linux propriétaire comme systeme d'exploitation.

    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
     
    sceNetInetListen(sock, 3); // listen
     
    	while(1)
    	{
    		sock = sceNetInetAccept(sock, (struct sockaddr *)&addr, (socklen_t *)&recsize);	//accept
     
    		if(sock > -1)
    		{
    			printf ("\nClient connecte avec la socket %d, adresse : %s:%d\n",sock, inet_ntoa (addr.sin_addr), htons (addr.sin_port));
     
    			printf("\nConnection etablie !\n");
     
    			thid[i] = sceKernelCreateThread("thread_transfert", thread_transfert, 0x18, 0x10000, PSP_THREAD_ATTR_USER, NULL); // creation d'un thread
     
    			if (thid[i] < 0)
    			{
    				printfC(ROUGEA,"Erreur : echec creation thread no %d !  Retour...\n",i);
    				return -1;
    			}
    			else
    			{
    				sceKernelStartThread(thid[i], sizeof(sock), &sock); // lancement du thread
    				i++;
    			}
    		}
    	}
    voila donc comme il y a plusieurs threads j'ai fait un tableau de 100 thid (thread id)
    Si j'enleve if(sock > -1) alors la première connection fonctionne mais ensuite probleme de socket a -1 .
    Si je le laisse, alors je vois afficher "connection établie" mais ensuite çà bloque ...

    edit : après une serie de test, le probleme vient du lancement du thread, a prioris c'est donc un probleme sur la psp
    edit 2 : après relecture des cours sur les sockets et relecture des header de la sdk psp, j'ai réglé mes problemes mes threads était lancés mais il n'y avait pas de controle de fin, etc... bref j'avais fait le goret ^^
    Merci bien, j'espere ne pas avoir a reposter ici (pour demander de l'aide)

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Erf encore un probleme, enfait mon multi-client c'est plutot un seul client qui se connecte n'importe quand... Or avec ce systeme je peux me connecter une fois mais lorsque je veux me reconnecter, le serveur ignore la demande de connection... il n'accepte pas la (re)connection... dois-je modifié ma socket avec setOpt ?

    (dsl pour le multi-post, il fallait que ce soit séparé pour une meilleure distinction)

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    UP ! je ne comprend vraiment pas !

    mon serveur fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    socket - bind - listen
    while(1) {
    if(accept) { createThread() }
    }
    Mon createThread() fait :
    Pour l'instant seul la première connection fonctionne... Lors de la deuxieme le serveur attend desesperement tout comme le client.
    Ou dois-je mettre shutdown RW - close ? Qu'est-ce qui ne va pas ?

  8. #8
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    Il faudrait savoir ce que fait la fonction createThread(), es-tu sûr qu'elle rende la main afin que le serveur puisse accepter de nouvelles connexions ?

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Voila mon thread :

    synchro
    reception
    sortie

    Dans le while du serveur je peux ajouter un waitEnd avant de boucler.

    Lorsque je lance l'application :
    -serveur en attente
    -client se connecte
    -serveur accepte
    -thread créé (no 1)
    -traitement dans le thread
    -attente de la fin du thread no 1
    -thread terminé (jusque là tout fonctionne)
    -attente d'un nouveau client -> BUG

    Le probleme est que si le client se reconnecte, rien ne se passe... ?!

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Il arrive un moment ou 3 jours entiers dans des lignes de codes provoquent des dérapage ^^ là mon erreur depuis une 10h d'heures etait que la variable contenant ma socket recevait le retour de accept() or si accepte() renvoyé -1 la boucle conservé -1 comme socket de reference. Donc une sauvegarde de la socket avant la boucle et hop le tour est joué. Je sais pas si j'étais clair :s

    M'enfin merci a tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Communication Serveur- Multi Client via socket
    Par jesuisperdu dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 14/03/2011, 09h37
  2. Problème communication serveur/client avec Socket
    Par Nicolas74 dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 03/12/2009, 16h54
  3. Liste chainée, sockets, serveur multi clients.
    Par jbarreau-mainson dans le forum Réseau
    Réponses: 4
    Dernier message: 01/05/2009, 12h15
  4. serveur multi client avec fork()
    Par deby23 dans le forum Réseau
    Réponses: 17
    Dernier message: 11/09/2007, 16h32
  5. [sockets][UDP][C/C++] serveur multi-clients
    Par l@rry dans le forum Développement
    Réponses: 4
    Dernier message: 08/06/2006, 14h11

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