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] bind ne renvoie pas TRUE mais aucune erreur


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut [Sockets] bind ne renvoie pas TRUE mais aucune erreur
    Bonjour

    Je fais face à un petit problème avec les sockets. Le but de mon code est de communiquer entre serveur et client. Tout est dans un seul programme.

    Cas n°1 : on lance le programme pour la première fois, donc le programme passe en mode serveur et attend qu'un client se connecte.

    Cas n°2 : le programme est déjà lancé et on le relance encore une fois, donc le programme passe en mode client pour communiquer avec le serveur déjà lancé.

    Le problème survient quand j'appelle la fonction bind (qui se trouve dans la partie serveur du code). Quand je fais un perror("bind"), il me met "No error". Pourtant, ma condition renvoie FALSE. Je vous laisse mon 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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
    #define PORT 4000
     
    int main(int argc, char *argv[])
    {
        WSADATA WSAData;
        int erreur = WSAStartup(MAKEWORD(2, 0), &WSAData);
     
        // SERVEUR
        SOCKADDR_IN sin;
        SOCKET sock;
     
        // CLIENT
        SOCKADDR_IN csin;
        SOCKET csock;
     
        int sock_err;
     
        if(!erreur)
        {
            sock = socket(AF_INET, SOCK_STREAM, 0);
     
            sin.sin_addr.s_addr = inet_addr("127.0.0.1");
            sin.sin_family = AF_INET;
            sin.sin_port = htons(PORT);
     
            if(connect(sock, (SOCKADDR *) &sin, sizeof(sin)) != SOCKET_ERROR) // connexion réussie, on passe en mode client
            {
                printf("Connecte a %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
            }
     
            else // la connexion a échoué, on passe en mode serveur
            {
                unsigned int recsize = (unsigned int) sizeof sin;
                unsigned int crecsize = (unsigned int) sizeof csin;
     
                if(sock != INVALID_SOCKET)
                {
                    sock_err = bind(sock, (SOCKADDR *) &sin, recsize);
     
                    if(sock_err != SOCKET_ERROR)
                    {
                        sock_err = listen(sock, 5);
     
                        if(sock_err != SOCKET_ERROR)
                        {
                            printf("En attente d'un client ...\n");
                            csock = accept(sock, (SOCKADDR *) &csin, (int*)&crecsize);
                            printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));
                        }
                        else
                            perror("listen");
                    }
                    else
                        perror("bind");
     
                    closesocket(csock);
                    closesocket(sock);
                }
                else
                    perror("socket");
            }
     
            WSACleanup();
        }
     
        system("PAUSE>NUL");
     
        return EXIT_SUCCESS;
    }
    Merci d'avance

  2. #2
    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
    Réponse donnée ailleurs :

    Je fais face à un petit problème avec les sockets. Le but de mon code est de communiquer entre serveur et client. Tout est dans un seul programme.
    - Pour passer en mode serveur, il faut fermer le socket et le rouvrir
    - Il faut un bind avec INETADDR_ANY
    - perror() ne fonctionne pas avec les erreurs réseau sous WIndows.
    Ceci fonctionne :
    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
     
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    #if 1
    #define PORT 4000
    #define IP "127.0.0.1"
    #else
    #define PORT 23
    #define IP "192.168.0.1"
    #endif
     
    #define NELEM(a) (sizeof(a)/sizeof*(a))
     
    static void psock_perror (char const *cmt)
    {
    #if defined (WIN32) || defined (_WIN32)
     
       fprintf (stderr, "%s: ", cmt);
       {
          DWORD err = WSAGetLastError ();
          wchar_t msg[1024];
          FormatMessageW (FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0,
                          msg, NELEM (msg), NULL);
          fwprintf (stderr, L"%s\n", msg);
       }
     
    #elif defined (linux) || defined (_POSIX_VERSION) || defined (_POSIX2_C_VERSION)\
     || defined (_XOPEN_VERSION)
     
       perror (cmt);
     
    #else
    #error not defined for this platform
    #endif
     
    }
     
    int main (void)
    {
       WSADATA WSAData;
       int erreur = WSAStartup (MAKEWORD (2, 0), &WSAData);
     
       int sock_err;
     
       if (!erreur)
       {
          /* tentative de mode client */
          SOCKET sock = socket (AF_INET, SOCK_STREAM, 0);
          if (sock != INVALID_SOCKET)
          {
             SOCKADDR_IN sin;
     
             sin.sin_family = AF_INET;
             sin.sin_addr.s_addr = inet_addr (IP);
             sin.sin_port = htons (PORT);
     
             if (connect (sock, (SOCKADDR *) & sin, sizeof (sin)) != SOCKET_ERROR) /* connexion réussie, on passe en mode client */
             {
                printf ("Mode serveur\n");
                printf ("Connecte a %s sur le port %d\n",
                        inet_ntoa (sin.sin_addr), htons (sin.sin_port));
             }
             else                   /* la connexion a échoué, on passe en mode serveur */
             {
     
                printf ("Mode serveur\n");
     
                closesocket (sock);
                sock = socket (AF_INET, SOCK_STREAM, 0);
     
                if (sock != INVALID_SOCKET)
                {
                   sin.sin_family = AF_INET;
                   sin.sin_addr.s_addr = htonl (INADDR_ANY);
                   sin.sin_port = htons (PORT);
     
                   sock_err = bind (sock, (SOCKADDR *) & sin, sizeof (sin));
     
                   if (sock_err != SOCKET_ERROR)
                   {
                      sock_err = listen (sock, 5);
     
                      if (sock_err != SOCKET_ERROR)
                      {
                         /* CLIENT */
                         SOCKADDR_IN csin;
                         SOCKET csock;
                         unsigned int crecsize = (unsigned int) sizeof csin;
                         printf ("En attente d'un client ...\n");
                         csock =
                            accept (sock, (SOCKADDR *) & csin, (int *) &crecsize);
                         printf
                            ("Un client se connecte avec la socket %d de %s:%d\n",
                             csock, inet_ntoa (csin.sin_addr),
                             htons (csin.sin_port));
                         closesocket (csock);
                      }
                      else
                         psock_perror ("listen");
                   }
                   else
                      psock_perror ("bind");
     
                }
                else
                   psock_perror ("socket");
             }
             closesocket (sock);
          }
          else
             psock_perror ("socket");
          WSACleanup ();
       }
     
       return EXIT_SUCCESS;
    }
    Serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Mode serveur
    En attente d'un client ...
    Un client se connecte avec la socket 72 de 127.0.0.1:52258
     
    Process returned 0 (0x0)   execution time : 43.277 s
    Press any key to continue.
    Client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Microsoft Windows [version 6.0.6001]
    Copyright (c) 2006 Microsoft Corporation. Tous droits réservés.
     
    C:\Users\Emmanuel>cd\dev\hello
     
    C:\dev\hello>cd bin
     
    C:\dev\hello\bin>cd debug
     
    C:\dev\hello\bin\Debug>hello
    Mode serveur
    Connecte a 127.0.0.1 sur le port 4000
    Ceci peut aider :

    http://emmanuel-delahaye.developpez.com/reseaux.htm

Discussions similaires

  1. [XL-2013] Macro non fonctionnelle mais aucune erreur.
    Par Jabbabi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/04/2015, 22h57
  2. [PHP 5.4] la fonction mail me renvoie true mais je ne reçois pas d'email
    Par lganne dans le forum Langage
    Réponses: 4
    Dernier message: 08/04/2015, 09h49
  3. [Exchange 2010] Serveur ne renvoie pas de message d'erreur quand destinataire erroné
    Par Benjyii dans le forum Exchange Server
    Réponses: 2
    Dernier message: 10/04/2013, 15h08
  4. Erreur compilation vb2008 mais aucune erreur
    Par rock_4_ever dans le forum VB.NET
    Réponses: 2
    Dernier message: 02/08/2010, 15h33
  5. Réponses: 3
    Dernier message: 07/06/2007, 19h26

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