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 :

pourquoi send muet sans recv?


Sujet :

Réseau C

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut pourquoi send muet sans recv?
    Bonjour,
    j'écris les prémices d'un client HTTP en commençant par le test d'une requête GET avec le code suivant. Mes deux machines dont l'une est serveur avec Wamp sont connectées l'une à l'autre par un câble croisé. Tout fonctionnait à travers un navigateur ou via telnet mais nada avec ce code jusqu'à ce que j'y implémente un recv() suite au send(). Wireshark me montrait bien les trames échangées après le connect() puis plus rien, comme si le send() n'émettait rien du tout.
    Ma question:
    comment fonctionne exactement un échange en mode connecté? Pourquoi ne voit-on rien passer suite au send() avec un message d'erreur si personne n'écoute de l'autre côté?

    Merci

    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
     
    /*
    ** envoi d'une requête Get vers la page index.html du répertoire www de wamp
    */
     
    int main()
    {
        int sock;
     
        char req[512] = {"GET /index.html HTTP/1.1\r\n"};
        strcat(req, "HOST: 192.168.0.2\r\n");
        strcat(req, "\r\n");
     
        if((sock = setClientHTTP()) == 0)
        {
            printf("Erreur: echec initialisation connexion reseau\n");
            return 0;
        }
     
        send(sock, req, strlen(req), 0);
        close(sock);
        WSACleanup();
     
        return 0;
    }
     
    /******************************************************************************
    ** setClientHTTP(): initialise le client HTTP
    ** Entrée:
    ** Sortie: 1 si ok, 0 sinon
    ******************************************************************************/
    int setClientHTTP()
    {
        int sockfd;
        struct sockaddr_in remote;
        WSADATA wsaData;
     
        if (WSAStartup(MAKEWORD(2,1), &wsaData) != 0) {
            fprintf(stderr, "WSAStartup failed.\n");
            return 0
        }
     
        if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {
            perror("Socket");
            WSACleanup();
            return 0;
        }
     
        memset(&remote, 0, sizeof(remote)); // en System V
        remote.sin_family = AF_INET;
        remote.sin_port = htons(80);
        remote.sin_addr.s_addr = inet_addr("192.168.0.2");
        if (connect(sockfd, (struct sockaddr*)&remote, sizeof(remote)) < 0) // error
        {
            perror("Connect");
            WSACleanup();
            return 0;
        }
        return sockfd;
    }

  2. #2
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Lorsque tu effectues ton send, tu n'attends pas de retour, tu closes directement la socket.

    Les sockets, il faut les voir comme un long tunnel (en mode connecté).

    Lorsque tu envoies des données, tu vérifies que le feu à l'entrée du tunnel est au vert (donc que la connexion est établie).
    Lorsque tu closes une socket (d'un coté ou de l'autre) les feux de chaque coté du tunnel passent au rouge.
    Tu ne peux donc plus envoyer de données.
    Il est donc normal que seul ton send coté client soit vu et non pas celui coté serveur, car quand le serveur veut envoyer un paquet de données, tu as déjà fermé le tunnel.

    Lorsque tu effectues un recv, le programme va attendre des données (recv est bloquant jusqu'à recevoir les données ou un signal d'interruption. Le serveur aura donc le temps de t'envoyer les données avant que tu fermes la connexion.

    Ça répond à ta question ?
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  3. #3
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Bonjour,
    merci pour la métaphore, elle est excellente.
    J'ai bien compris, ça répond à mes questionnements.

    Merci.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/02/2010, 09h33
  2. DLL String Pourquoi ça marche sans BORLNDMM.DLL
    Par ShaiLeTroll dans le forum Langage
    Réponses: 14
    Dernier message: 09/09/2009, 10h41
  3. send() bloque sans jamais sortir
    Par Naeco dans le forum C++
    Réponses: 3
    Dernier message: 30/03/2007, 17h38
  4. [NASM] Faire un prog.exe sans prog.obj, pourquoi ?
    Par madax dans le forum Assembleur
    Réponses: 1
    Dernier message: 07/01/2005, 01h23
  5. [SOCKET C] deux send() pour un recv()
    Par trois_1 dans le forum Développement
    Réponses: 4
    Dernier message: 01/12/2003, 19h13

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