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 :

Serveur Multiclient sockets


Sujet :

Réseau C

  1. #1
    Membre régulier

    Homme Profil pro
    Étudiant Réseaux et Télécoms
    Inscrit en
    Octobre 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant Réseaux et Télécoms
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 121
    Points : 92
    Points
    92
    Par défaut Serveur Multiclient sockets
    Bonsoir à tous,

    Je vais tout d'abord, dire ce que j'essaye de faire

    Un premier joueur rentre son pseudo et l'envoie au serveur, puis un deuxieme joueurs,troisieme et quatrieme.

    Lorsque les quatre joueurs ont envoyé leur pseudo, alors j'envoie à tout le monde grâce au serveur, tous les pseudos des joueurs



    Voici les deux programmes:

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    \\SERVEUR
     
        #include <winsock2.h>
        typedef int socklen_t;
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
     
    #define PORT 23
     
     
     
     
     
     
    int main(void)
    {
     
            WSADATA WSAData;
            int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
            int continuer=1;
            int i;
     
     
        SOCKET sock0;
     
     
        SOCKADDR_IN sin0;
     
     
     
     
        SOCKADDR_IN csin0;
     
     
        int recsize0 = sizeof sin0;
     
     
     
        char lettres[20]="";
        char joueur1[20]="";
        char joueur2[20]="";
        char joueur3[20]="";
        char joueur4[20]="";
     
     
     
        int sock_err;
     
     
            sock0 = socket(AF_INET, SOCK_STREAM, 0);
     
     
     
                printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock0);
     
     
                sin0.sin_addr.s_addr = htonl(INADDR_ANY);
                sin0.sin_family = AF_INET;
                sin0.sin_port = htons(PORT);
     
     
     
     
                bind(sock0, (SOCKADDR*) &sin0, recsize0);
     
     
     
                    listen(sock0, 5);
     
                      int crecsize0 = sizeof csin0;
     
                                SOCKET csock0 = accept(sock0, (SOCKADDR *) &csin0, &crecsize0);
                               recv(csock0, joueur1, joueur1, 0);
                               printf("%s",joueur1);
                                closesocket(csock0);
     
                                SOCKET csock1 = accept(sock0, (SOCKADDR *) &csin0, &crecsize0);
                                recv(csock1, joueur2, 20, 0);
                                printf("%s",joueur2);
                              //  closesocket(csock1);
     
                                SOCKET csock2 = accept(sock0, (SOCKADDR *) &csin0, &crecsize0);
                                recv(csock2, joueur3, 20, 0);
                                printf("%s\n",joueur3);
                               // closesocket(csock2);
     
     
                                SOCKET csock3 = accept(sock0, (SOCKADDR *) &csin0, &crecsize0);
                                recv(csock3, joueur4,20, 0);
                                printf("%s",joueur4);
                               // closesocket(csock3);
     
     
     
                                csock0;
                                send(csock0,joueur1,20, 0);
                                send(csock0,joueur2,20, 0);
                                send(csock0,joueur3,20, 0);
                                send(csock0,joueur4,20, 0);
     
                               // closesocket(csock0);
     
                                csock1;
                                send(csock1,joueur1,20, 0);
                                send(csock1,joueur2,20, 0);
                                send(csock1,joueur3,20, 0);
                                send(csock1,joueur4,20, 0);
     
                               // closesocket(csock1);
     
                                csock2;
                                send(csock2,joueur1,20, 0);
                                send(csock2,joueur2,20, 0);
                                send(csock2,joueur3,20, 0);
                                send(csock2,joueur4,20, 0);
     
                               // closesocket(csock2);
     
                                csock3;
                                send(csock3,joueur1,20, 0);
                                send(csock3,joueur2,20, 0);
                                send(csock3,joueur3,20, 0);
                                send(csock3,joueur4,20, 0);
     
                                //closesocket(csock3);
     
     
     
     
     
     
     
     
            WSACleanup();
     
     
        return EXIT_SUCCESS;
    }

    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
    \\CLIENT
    sock = socket(AF_INET, SOCK_STREAM, 0);
     
     
                                                sin.sin_addr.s_addr = inet_addr("192.168.1.10");
                                                sin.sin_family = AF_INET;
                                                sin.sin_port = htons(23);
                                               connect(sock, (SOCKADDR*)&sin, sizeof(sin));
     
                                                send(sock,lettres,20,0);
     
     
                                                recv(sock,joueur1,20,0);
                                                recv(sock,joueur2,20,0);
                                                recv(sock,joueur3,20,0);
                                                recv(sock,joueur4,20,0);
                                                closesocket(sock);
    Merci de votre aide.

    PS: Je tiens à présicer que je suis sur un projet de poker La partie client est presque terminée...

  2. #2
    Membre régulier

    Homme Profil pro
    Étudiant Réseaux et Télécoms
    Inscrit en
    Octobre 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant Réseaux et Télécoms
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 121
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    J'arrive a envoyer au serveur les pseudos, le serveur les affiche mais lorsque le serveur doit renvoyer tous les pseudos à chanque joueur, il n'envoit que le premier pseudo...

    Voici le code:

    Serveur:
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    #include <winsock2.h>
        typedef int socklen_t;
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
     
    #define PORT 23
     
     
     
     
     
     
    int main(void)
    {
     
            WSADATA WSAData;
            int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
            int continuer=1;
            int i;
     
     
        SOCKET sock0;
     
     
        SOCKADDR_IN sin0;
     
     
     
     
        SOCKADDR_IN csin0;
     
     
        int recsize0 = sizeof sin0;
     
     
     
        char lettres[20]="";
        char joueur1[20]="";
        char joueur2[20]="";
        char joueur3[20]="";
        char joueur4[20]="";
     
     
     
        int sock_err;
     
     
            sock0 = socket(AF_INET, SOCK_STREAM, 0);
     
     
     
                printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock0);
     
     
                sin0.sin_addr.s_addr = htonl(INADDR_ANY);
                sin0.sin_family = AF_INET;
                sin0.sin_port = htons(PORT);
     
     
     
     
                bind(sock0, (SOCKADDR*) &sin0, recsize0);
     
     
     
                    listen(sock0, 5);
     
                      int crecsize0 = sizeof csin0;
     
                                SOCKET csock0 = accept(sock0, (SOCKADDR *) &csin0, &crecsize0);
                               recv(csock0, joueur1, 20, 0);
                               printf("%s",joueur1);
     
     
                             //   closesocket(csock0);
     
                                SOCKET csock1 = accept(sock0, (SOCKADDR *) &csin0, &crecsize0);
                                recv(csock1, joueur2, 20, 0);
                                printf("%s",joueur2);
     
                           //closesocket(csock1);
     
     
     
                        printf("%s",joueur1);
                        printf("%s",joueur2);
     
                            //     csock0;
                                send(csock0,joueur1,sizeof(joueur1), 0);
                                send(csock0,joueur2,sizeof(joueur2), 0);
     
     
     
     
                             //    closesocket(csock0);
     
                              //   csock1;
                                send(csock1,joueur1,sizeof(joueur1), 0);
                                send(csock1,joueur2,sizeof(joueur2), 0);
     
     
                              //   closesocket(csock1);
     
     
                             //    closesocket(csock3);
     
     
     
     
     
     
     
     
            WSACleanup();
     
     
        return EXIT_SUCCESS;
    }
    \\Client
    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
     
    #include <stdlib.h>
    #include <stdio.h>
     
     
    #include <winsock2.h>
     
     
    typedef int socklen_t;
     
    void main()
     
    {
        char lettres[20]="";
         char joueur1[20]="";
        char joueur2[20]="";
     
        WSADATA WSAData;
    int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
     
     
     SOCKET sock;
    SOCKADDR_IN sin;
     
    sock = socket(AF_INET, SOCK_STREAM, 0);
     
        scanf("%s",lettres);
     
                                                sin.sin_addr.s_addr = inet_addr("192.168.2.41");
                                                sin.sin_family = AF_INET;
                                                sin.sin_port = htons(23);
                                               connect(sock, (SOCKADDR*)&sin, sizeof(sin));
     
                                                send(sock,lettres,20,0);
     
     
                                                recv(sock,joueur1,20,0);
     
                                                recv(sock,joueur2,20,0);
     
                                                printf("%s\n",joueur1);
                                                printf("%s",joueur2);
                                                system("PAUSE");
     
     
     
                                                }
    Cordialement

  3. #3
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Là, j'ai un peu de mal à voir!
    Pour savoir où tes programmes sont bloqués, je te conseille de mettre des traces (printf) avant et après chaque recv et send, pour debugger.

  4. #4
    Membre régulier

    Homme Profil pro
    Étudiant Réseaux et Télécoms
    Inscrit en
    Octobre 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant Réseaux et Télécoms
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 121
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    Voilà j'ai eu la réponse directement de mon cher professeur.

    Le problème était que le buffer n'était pas assez rapide à écrire dans joueur

    Merci

  5. #5
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Ah !!!
    Perso, je vois pas le rapport.
    Tu as corrigé le problème en faisant quoi ?

  6. #6
    Membre régulier

    Homme Profil pro
    Étudiant Réseaux et Télécoms
    Inscrit en
    Octobre 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant Réseaux et Télécoms
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 121
    Points : 92
    Points
    92
    Par défaut
    J'ai mis mes pseudos dans une structure comme celà j'envoie qu'un send

    En faite, lorsque que vous recevez les données, ils sont dans un buffer.

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par fregolo52 Voir le message
    Là, j'ai un peu de mal à voir!
    Pour savoir où tes programmes sont bloqués, je te conseille de mettre des traces (printf) avant et après chaque recv et send, pour debugger.
    Mettre des traces c'est cool mais pas avec printf utilise plutôt write car printf "bufferise" et le debug avec printf c'est pas génial.

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par foOgito Voir le message
    Mettre des traces c'est cool mais pas avec printf utilise plutôt write car printf "bufferise" et le debug avec printf c'est pas génial.
    La procédure standard est soit de faire un fprintf() sur stderr, soit de faire un printf() en prenant soin de terminer le message par '\n' pour forcer l'affichage du contenu du buffer.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Socket pour Serveur/Multiclient
    Par NoussaL dans le forum VB.NET
    Réponses: 5
    Dernier message: 28/08/2008, 22h53
  2. Serveur de Socket
    Par ggounouman dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 22/08/2007, 14h08
  3. Lancer un serveur de socket par SSH
    Par ouss dans le forum Linux
    Réponses: 5
    Dernier message: 15/06/2007, 12h29
  4. [Réseau] Serveur multiclients (question théorique)
    Par Goundy dans le forum Réseau
    Réponses: 6
    Dernier message: 03/04/2007, 13h45
  5. Arrêt d'un serveur (connexion socket)
    Par Goduak dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 25/02/2007, 12h32

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