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 :

[Socket (débutant)] Connexion Serveur/Client sur le même PC


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut [Socket (débutant)] Connexion Serveur/Client sur le même PC
    Salut tout le monde, je viens à peine da apprendre les bases du C.

    J'ai lu le Tutoriel de TheWalrus sur les sockets en C/C++.

    La théorie c'est bien, mais la pratique c'est important, et c'est de là que provient mon problème, comment pratiquer ce qu'on apprend sur les Sockets si on a pas deux PC!.

    J'ai pensé à créer un serveur et un client, tout deux sur mon PC. Et le serveur envoie un message au client.

    Le 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
     
    #pragma comment(lib, "ws2_32.lib")
     
    int main(int argc, char *argv[])
    {
      char buffer[255]="";
     
      WSADATA WSAData;
      WSAStartup(MAKEWORD(2,0), &WSAData);
      SOCKET sock;
      SOCKADDR_IN sin;
      sin.sin_addr.s_addr = htons("127.0.0.1");
      sin.sin_family = AF_INET;
      sin.sin_port = htons(4111);
      sock = socket(AF_INET, SOCK_STREAM, 0);
     
      connect(sock, (SOCKADDR *)&sin, sizeof(sin));
      recv(sock, buffer, sizeof(buffer), 0);
      printf("%s\n", buffer);
     
      closesocket(sock);
      WSACleanup();
      system("PAUSE");	
      return 0;
    }
    Le 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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib")
     
     
    int main(int argc, char *argv[])
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib")
     
     
    int main(int argc, char *argv[])
    {
      // Initiantion de WSAStartup
      WSADATA WSAData;
      WSAStartup(MAKEWORD(2,0), &WSAData);
     
      // Création du Socket
      SOCKET sock;
      SOCKET csock;
      SOCKADDR_IN sin;
      SOCKADDR_IN csin;
      sin.sin_addr.s_addr = INADDR_ANY;
      sin.sin_family = AF_INET;
      sin.sin_port = htons(4111);
      sock = socket(AF_INET, SOCK_STREAM, 0);
      bind(sock, (SOCKADDR *)&sin, sizeof(sin));
     
      // Ecout
      listen(sock, 0);
      while (1)
      {
            int sinsize = sizeof(csin);
            if(csock = accept(sock, (SOCKADDR *)&csin, &sinsize) != INVALID_SOCKET)
            {
                     send(csock, "Hello world!\r\n", 14, 0);
            }
      }
     
      // Nettoyage de WSA
      WSACleanup();
      system("PAUSE");	
      return 0;
    }
    Ensuite, je compile les deux, et je les lance (Mon FireWall m'averti et j'accepte et tout). Et puis, j'attends que le client affiche quelque chose, et là, rien!

    Pouvez vous trouver d'ou provient le problem ?

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    je pense savoir d'ou viens le probleme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      recv(sock, buffer, sizeof(buffer), 0);
    Citation Envoyé par man recv
    Les fonctions de réception renvoient normalement les données disponibles sans attendre d'avoir reçu le nombre exact réclamé.
    c'est le "normalement" qui me fait douter.
    il me semble avoir eu des problemes de ce type (j'ai pas trop le temps de re-ouvrir les vieux codes pour voir ce que j'ai fait).
    essaye de recevoir caractére par caractére et tester quand tu reçois un \n.
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Tu veux dire que la fonction n'attend pas de tout recevoir ?

    Je vais voir ce que ça donne

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    J'ai envoyé un seul caractère, mais le Client reçoi toujours rien.

    Par contre, je sais maintenant que la fonction atten de recevoir puisque si j'ouvre le Serveur, puis j'ouvre le Client, le Client n'affiche rien, et quand je ferme le Serveur, il affiche un texte que je lui ai demandé d'afficher, mais apres la fonction recv.

    Aufait j'ai ajouté une ligne de code apres la fonction recv qui affiche "Hello".

  5. #5
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut

    j'avais mal lut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      printf("%c\n", buffer);
    %c attend un caractére, or ici tu lui passe un pointeur sur une chaine de caractére.
    le bon formatteur est %s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      printf("%s\n", buffer);
    ça devrais aller mieux
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    No, j'ai corrigé ça.

    Aufait maintenant le probleme c'est que le Client n'éxécute pas les lignes apres recv jusqu'a ce que je ferme le Serveur...

    Peut etre que c'est a cause de la boucle While.

    Edit:
    Ouais c'est bien cela, j'ai donc éléminé la boucle While. Et le code qui suit recv dans le Client s'éxécute, il doit afficher le buffer qui est envoyé par le Serveur, mais il affiche la valeur par défaut de buffer.

  7. #7
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Dexter00
    Tu veux dire que la fonction n'attend pas de tout recevoir ?

    Je vais voir ce que ça donne
    Oui il faudrait boucler avec un timer ( ou mieux créer une fonction dans un processus ( Thread ) qui tourne en tache de fond , lancée avec _beginthread().)

    En fait c'est plus complexe que cela ; il faut gérer des messages propres aux sockets comme WM_SOCKET_NOTIFY>FD_CONNECT_FD_READ
    Dans le code il faut une "pompe" à message
    while (GetMessage (&msg, NULL, 0, 0))
    {
    TranslateMessage (&msg) ;
    DispatchMessage (&msg) ;
    }
    Regarder le MSDN autour de ces messages.
    Sinon dans les tutoriels de VC++ il ya un exemple fait par Farscape je crois
    Dernière modification par mat.M ; 25/08/2006 à 20h11.

Discussions similaires

  1. [IP ?][Socket] Serveur/Client sur Internet.
    Par Speedlight dans le forum Réseau/Web
    Réponses: 7
    Dernier message: 08/11/2011, 20h00
  2. Réponses: 24
    Dernier message: 18/01/2011, 12h21
  3. Réponses: 1
    Dernier message: 01/10/2009, 14h03
  4. Réponses: 3
    Dernier message: 29/08/2008, 18h21
  5. [MySQL] Connexion multi-database sur le même serveur
    Par brazza dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 27/11/2005, 11h34

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