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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    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 éprouvé Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    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éé.

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    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 éprouvé Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    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

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    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
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    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)

+ 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