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 :

Sockets et problème concept


Sujet :

Réseau C

  1. #1
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut Sockets et problème concept
    Bonjour,
    J'ai 2 problèmes à vous soumettre en cette belle matinée de fin de semaine.
    Tout d'abord une brève introduction à mon but : j'essaie pour le moment de faire un serveur qui accepte toutes le connexions sur le port X pour ensuite utiliser ces connexions pour un chat.

    Donc mon premier problème est un problème de 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
     
    typedef struct
    {
            SOCKET socket;
            SOCKADDR_IN sin;
            char nom[255];
            int connexion; 
            int position_x;
            int position_y;       
    } client;
     
    int main(int argc, char *argv[])
    {
        WSADATA WSAData; // sert simplement à dire au système que l'on va utiliser des socket
        SOCKET sock; // initialisation d'un socket
        SOCKADDR_IN sin; // informations techniques du socket
        int socket_accept = 0; // valeur de retour du accept()
        char buffer[255]; // réception sur le socket
        client *clients;
        long nombre_clients = 0;
        //clients = malloc(sizeof(client)); // on créé juste une place pour le moment
     
        WSAStartup(MAKEWORD(2,0), &WSAData); // initialisation du WSA
        sin.sin_addr.s_addr = htonl(INADDR_ANY); // serveur, donc pas de destination
        sin.sin_family  = AF_INET; // type de socket
        sin.sin_port  = htons(54321); // port d'écoute
        sock = socket(AF_INET,SOCK_STREAM,0); // création du socket
        bind(sock, (SOCKADDR *)&sin, sizeof(sin)); // lien entre le port/adresse et le socket
     
        listen(sock,0); // écoute sur le socket sock sans limite du nombre de connexions
        printf("En ecoute...\n");
        while(1)
        {
                nombre_clients++;
                clients = realloc(clients, nombre_clients * sizeof(client));
                int sinsize = sizeof(clients[nombre_clients-1].sin);
                if (clients[nombre_clients-1].socket = accept(sock, (SOCKADDR *)&clients[nombre_clients-1].sin, &sinsize) != INVALID_SOCKET)
          {
                      printf("Accepte depuis %s\n", inet_ntoa(clients[nombre_clients-1].sin.sin_addr));
                      recv(clients[nombre_clients-1].socket,buffer,255,0);
                      printf("%s", buffer);
          }
        }
     
        getch();
        closesocket(sock);
        WSACleanup(); // Nettoyage du WSA 
        return 0;
    }
    Donc en gros j'ouvre ma connexion sur socket et j'écoute. Ensuite, a peine je reçois une connexion, j'aimerais enregistrer ce client sous clients[i].socket pour pouvoir traiter chaque client séparément. Je ne sais pas si c'est comme ça qu'il faudrait faire.

    Ensuite ma 2ème question : Pour gérer simultanément les actions des clients et les nouveaux clients qui arrivent, je dois utiliser des theads ???

    Merci d'avance pour votre aide

  2. #2
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Ca parait correct.
    2 choses toutefois :
    il est couteux de faire un realloc de 1 à chaque fois
    que va tu faire en cas de deconnection d'un client ? ( laisser un trou dans le tableau ? ) ëut-etre une liste chainée serait plus intéressante.

    Pour la deuxième question, tu peux passer par des threads mais aussi par select ( ca sera surement plus simple ).

  3. #3
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    select n'a pas quelques problèmes sous Windows??
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Skyrunner
    select n'a pas quelques problèmes sous Windows??
    Pour les sockets, non. Par contre, bêtement, il ne fonctionne pas avec stdin...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int sinsize = sizeof(clients[nombre_clients-1].sin);
    if (clients[nombre_clients-1].socket = accept(sock, (SOCKADDR *)&clients[nombre_clients-1].sin, &sinsize) != INVALID_SOCKET)
    {
            printf("Accepte depuis %s\n", inet_ntoa(clients[nombre_clients-1].sin.sin_addr));
            send(sock, "carlo\0", strlen("carlo\0"), 0);
    }
    Quoi qu'il en soit j'arrive pas a transmettre ce mot à l'hyperterminal. Je me pose notamment des questions sur ma façon d'écrire le accept, j'ai des serieux doutes sur l'exactitude de ce que j'ai fait.

    Merci de votre aide

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ca ne serait pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    clients[nombre_clients-1].socket
    qu'il faut passer à ta fonction send?

  7. #7
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    dsl c'est parce que j'avais testé les deux possibilités.

    non ça ne marche pas non plus comme ça.

    Mais est-ce que l'hyperterminal peut recevoir des données ?

    sur le programme je vois la connexion qui est accepté depuis 127.0.0.1, mais l'hyperterminal n'affiche pas les données.

    merci pour ton aide en tout cas

  8. #8
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    L'hyperterminal attend surement un protocole type telnet en face, ou les requêtes se terminent par \r\n. Au passage, quel est l'interet de \0 dans ta chaine ?

  9. #9
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    pour le \0, ça ne marchait pas sans, alors j'ai essayé avec

    sinon avec le \r\n ça ne marche pas non plus

  10. #10
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    arg, c'est quoi cette écriture (faut du temps pour que je me réveille...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (clients[nombre_clients-1].socket = accept(sock, (SOCKADDR *)&clients[nombre_clients-1].sin, &sinsize) 
                         != INVALID_SOCKET)
    Il faudrait une parenthèse en plus non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ((clients[nombre_clients-1].socket = accept(sock, (SOCKADDR *)&clients[nombre_clients-1].sin, &sinsize)) 
                      != INVALID_SOCKET)
    Jc

  11. #11
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    Ah ça marche merveilleux, merci à tes yeux d'avoir vu cette erreur

    euh sinon maintenant ma 2ème question, disons que j'ai mon socket principal, et 22000 socket clients. Comment je fait pour être à l'écoute de tous mes clients ?

  12. #12
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par PoZZyX
    Ah ça marche merveilleux, merci à tes yeux d'avoir vu cette erreur

    euh sinon maintenant ma 2ème question, disons que j'ai mon socket principal, et 22000 socket clients. Comment je fait pour être à l'écoute de tous mes clients ?
    select

    Tu met toutes les sockets de tes clients dans le select, et lorsque le select se declanche tu regardes quelle socket a parlé et tu as ton client.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  13. #13
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Mais la solution la plus élégante est de créer à chaque fois un nouveau thread avec en paramètre la socket renvoyée par "accept". D'ailleurs c'est de cette manière que fonctionne (en générale) les applis clients-serveurs.
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  14. #14
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    merci crocodilex je vais essayer ta solution étant donné que j'aimerais faire ça assez proprement.

    Merci à toutes les personnes m'ayant aidé

  15. #15
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Je ne vois pas en quoi c'est plus élégant.

    Crée 200 000 thread, et regarde comment le scheduler s'affole. De plus la programmation multi thread est plus complexe, beaucoup plus difficile à debugger, etc ... et franchement pas portable.

    A mon avis, tu devrais partir sur quelquechose de plus simple qu'un programme multi threadé surtout que tes bases de C ne me semblent pas très solide.

  16. #16
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par zul
    Je ne vois pas en quoi c'est plus élégant.

    Crée 200 000 thread, et regarde comment le scheduler s'affole. De plus la programmation multi thread est plus complexe, beaucoup plus difficile à debugger, etc ... et franchement pas portable.

    A mon avis, tu devrais partir sur quelquechose de plus simple qu'un programme multi threadé surtout que tes bases de C ne me semblent pas très solide.
    Alors dans ce cas là expliques moi comment il va faire pour que ses 200000 clients puissent se connecter à son serveur qui a un numéro de port unique. Dans son cas précis, la fonction select n'est absolument pas adaptée.
    Pour prendre un exemple, regarde de plus près comment fonctionne un serveur FTP.
    Et pour ce qui est de la portabilité, regarde bien son code. A mon avis il n'est pas portable non plus.
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par crocodilex
    Alors dans ce cas là expliques moi comment il va faire pour que ses 200000 clients puissent se connecter à son serveur qui a un numéro de port unique. Dans son cas précis, la fonction select n'est absolument pas adaptée.
    Certes, le numéro de port du serveur est unique, mais chaque socket client est différent. Qu'ils soient traités par un processus avec select() ou par des threads ne change rien.

    Rien de tout celà n'a à voir avec le langage C (qui n'est qu'un outil de programmation...)

    http://www.developpez.net/forums/forumdisplay.php?f=63
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    Nop mes bases ne sont pas très solides lol, j'essaie justement de m'améliorer.

    Y a d'autre moyen de communiquer via internet que par les sockets ?

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PoZZyX
    Y a d'autre moyen de communiquer via internet que par les sockets ?
    Tu fais un sacré mélange... Internet n'est qu'un réseau parmi d'autres... Les sockets (origine BSD) sont le moyen logiciel standard (POSIX) permettant à une application de se connecter à ce réseau (INET) ou à d'autres, pas forcément IP. A ce jour, je ne connais pas d'autres moyens.

    Il y a bien eu winsock(), au debut de Windows (3.11), mais il a été très vite remplacé par winsock2 qui est quasiment identique aux sockets BSD.

    Nota : Les sockets UNIX permettent de faire communiquer 2 applications sur une même machine....

    Pourquoi cette question. Tu as un problème avec les sockets ?
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Certes, le numéro de port du serveur est unique, mais chaque socket client est différent. Qu'ils soient traités par un processus avec select() ou par des threads ne change rien.
    D'accord avec toi, mais pour résoudre son problème, il faut forcement crée au moins un thread (dans le cas où tu veux utiliser select). Sinon je ne vois pas comment tu peux, en même temps, être à l'écoute d'une nouvelle connexion éventuelle (via "accept") et intercepter des messages venant des clients déjà connectés (via "select").

    Et puis, c'est vrai, ce n'est pas du langage C tout ça......
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème conception base de données
    Par rico3030 dans le forum Schéma
    Réponses: 5
    Dernier message: 17/09/2007, 17h46
  2. [Socket SSL] problème de "Segmentation fault"
    Par jesus144 dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 09/03/2007, 19h50
  3. [socket/ereg] probléme script socket
    Par UNi[FR] dans le forum Langage
    Réponses: 2
    Dernier message: 06/06/2006, 16h36
  4. Problème conception table
    Par Ouark dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/01/2006, 16h49
  5. [N-Tier] Problème conception architecture 3-tiers
    Par Royd938 dans le forum Autres
    Réponses: 3
    Dernier message: 17/06/2005, 11h47

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