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 send et recv


Sujet :

Réseau C

  1. #21
    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 sebatlante Voir le message
    Le serveur est bien sur la meme machine(qui est sous linux) d'où 127.0.0.1.
    Le port 65535 est bien ouvert sur le serveur et est valide.

    J'ai fait les modif:
    <...>
    Cela ne fonctionne toujour pas, la fonction connect renvoie -1...
    Curieusement, ce code (serveur corrigé, la partie client est inhibée) ne fonction qu'avec un telnet sur le port 23...

    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
    142
    143
    144
    145
    146
    147
    148
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #ifdef WIN32
    #include <winsock2.h>
    #else
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(param) close(param)
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
    #endif
     
    #define PORT 23
     
    #if 0
    /* client */
    int main_ (void)
    {
       SOCKET sock_client;
       char buffer[30];
       SOCKADDR_IN sin = { 0 };
       int rec;
       int error;
     
       sock_client = socket (AF_INET, SOCK_STREAM, 0);
       if (sock_client != INVALID_SOCKET)
       {
          printf ("aucun probleme dans la fonction socket\n");
          sin.sin_addr.s_addr = inet_addr ("127.0.0.1");
          sin.sin_family = AF_INET;
          sin.sin_port = htons (PORT);
          error = connect (sock_client, (SOCKADDR *) & sin, sizeof (sin));
          if (error == 0)
          {
             printf ("aucun probleme dans la fonction connect\n");
             rec = recv (sock_client, buffer, sizeof (buffer) - 1, 0);
             if (rec > 0)
             {
                buffer[rec] = 0;
                printf ("%s\n", buffer);
             }
          }
          else
          {
             printf ("connect() error\n");
          }
       }
       closesocket (sock_client);
    //-------------------------------------------------------------------------fin du code non minimal----------------------------------------
       return EXIT_SUCCESS;
    }
    #else
    /* serveur */
     
    int main_ (void)
    {
       SOCKET sock = socket (AF_INET, SOCK_STREAM, 0);
       if (sock != INVALID_SOCKET)
       {
          SOCKADDR_IN sin = { 0 };
          printf ("socket serveur = %d\n", sock);
     
          sin.sin_addr.s_addr = htonl (INADDR_ANY);
          sin.sin_family = AF_INET;
          sin.sin_port = htons (PORT);
          {
             int err = bind (sock, (SOCKADDR *) & sin, sizeof (sin));
             if (err != SOCKET_ERROR)
             {
                printf ("bind() OK\n");
                err = listen (sock, 5);
                if (err != SOCKET_ERROR)
                {
                   printf ("listen() OK\n");
                   int fin = 0;
                   while (!fin)
                   {
                      SOCKADDR_IN sin_cli = { 0 };
                      int taille = (int) sizeof sin_cli;
                      SOCKET sock_client;
                      printf ("listening on port %d\n", (int) ntohs(sin.sin_port));
     
                      sock_client=   accept (sock, (SOCKADDR *) & sin_cli, &taille);
                      if (sock_client != INVALID_SOCKET)
                      {
                         printf ("socket client = %d\n", sock_client);
                         {
                            char const *buffer = "buffer\r\n";
                            int n = send (sock_client, buffer, strlen (buffer), 0);
                            printf ("%d bytes emis\n", n);
                            fin = 1;
                         }
                      }
                   }
                }
             }
          }
       }
       closesocket (sock);
     
       return EXIT_SUCCESS;
    }
     
    #endif
     
    int main (void)
    {
       int ret;
     
    #if defined (WIN32)
       WSADATA wsa_data;
       int err = WSAStartup (MAKEWORD (2, 2), &wsa_data);
     
       if (!err)
       {
          puts ("WIN: winsock2: OK");
    #else
       int err;
    #endif
     
       main_ ();
     
    #if defined (WIN32)
       WSACleanup ();
    }
    #endif
     
    if (err)
    {
       ret = EXIT_FAILURE;
    }
    else
    {
       ret = EXIT_SUCCESS;
    }
     
    return ret;
    }
    Serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WIN: winsock2: OK
    socket serveur = 1960
    bind() OK
    listen() OK
    listening on port 23
    socket client = 1932
    8 bytes emis
     
    Press ENTER to continue.
    Client telnet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    buffer
     
     
    Perte de la connexion à l'hôte.
    Après essai du client avec ce serveur, je confirme que j'ai pu effectuer une connexion sur le port 1024 et sur 65535 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WIN: winsock2: OK
    socket serveur = 1960
    bind() OK
    listen() OK
    listening on port 65535
    socket client = 1932
    8 bytes emis
     
    Press ENTER to continue.
    Pas de Wi-Fi à la maison : CPL

  2. #22
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    Ce qui veut dire que le client devrai THEORIQUEMENT se connecter au serveur par le port 65535 mais dans la pratique ce n'est pas le cas?

    donc a partir de là tu n'a plus de solution?

    Si c'est le cas merci de m'avoir aider pour mettre de l'ordre dans mon code.

  3. #23
    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 sebatlante Voir le message
    Ce qui veut dire que le client devrai THEORIQUEMENT se connecter au serveur par le port 65535 mais dans la pratique ce n'est pas le cas?

    donc a partir de là tu n'a plus de solution?

    Si c'est le cas merci de m'avoir aider pour mettre de l'ordre dans mon code.
    Je me demande si tu lis mes réponses...
    1. J'ai dit que j'avais réussi à me connecter et à transmettre des données sur le port 65535 avec ton client et ton serveur corrigés.
    2. J'ai publié le code du client et du serveur corrigé

    Nota : j'ai fait les tests sous Windows, mais le même code devrait fonctionner sous Linux (la compilation conditionnelle faisant le tri automatiquement).
    Pas de Wi-Fi à la maison : CPL

  4. #24
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    mauvaise compréhension désolé.

    merci ça fonctionne

  5. #25
    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 sebatlante Voir le message
    merci ça fonctionne
    Ah, ben voilà une bonne nouvelle...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/02/2015, 18h06
  2. Sur un socket : send et recv ou read et write ?
    Par Médinoc dans le forum Réseau
    Réponses: 35
    Dernier message: 05/11/2009, 15h51
  3. [socket] Pb send() et recv()
    Par Tymk dans le forum C++
    Réponses: 6
    Dernier message: 03/06/2008, 18h44
  4. [Socket] Send/Recv type double sur architectures différentes
    Par nicolas.pied dans le forum Réseau
    Réponses: 4
    Dernier message: 31/03/2006, 20h33

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