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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    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 chevronné 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
    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 confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    select n'a pas quelques problèmes sous Windows??

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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...

  5. #5
    Membre éclairé Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    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 confirmé

    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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    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?

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

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