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

C++ Discussion :

connaitre la bonne taille de buffer à utiliser pour la lecture de socket


Sujet :

C++

  1. #21
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    En fait ce qui me pose un probleme c'est que data et sent sont de types differents et que tu les additionne ...
    Sinon pour la question sur les string , laisse tomber, encore une inpeptie sortie
    de mon petit cerveau fatigué ...

  2. #22
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En fait ce qui me pose un probleme c'est que data et sent sont de types differents et que tu les additionne ...
    Data est un pointeur sur char : lui additionner un entier fera se déplacer le pointeur d'autant d'octets (c'est l'arithmétique des pointeurs).

  3. #23
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    Ah mes non d'accord en fait je suis c** aujourd'hui !!
    Data c'est un pointeur qui pointe vers le premier element du tableau
    char data[] non ??
    A ce moment la on peut alors lui ajouter sent pour que sa pointe vers le debut
    données pas encore envoyées ...
    Enfin je suis peut etre entrin de m'enfoncer encore plus la ..... Sacré sockets ...

  4. #24
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    Ok ok bon ba j'ai enfin compris , un grand merci pour ton aide et surtout pour ta patiente, pasqu'avec moi il en vaut une bonne dose ...

  5. #25
    Membre actif Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Points : 274
    Points
    274
    Par défaut
    des tubes avec des sockets... quel cauchemard!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int Res = send(Data + Sent, SizeInBytes - Sent, ...);
    send prend en paramètre un descripteur, donc la socket correspondante. c'est quoi ce data+sent?

    ps: quelle différence pour un réseau tcp mode connecté entre [read & write] et [recv & send]?

    j'ai toujours utilisé pour du tcp write et read. et pour l'udp recvfrom et sendto.

    et au fait qu'est ce que fait une discussion sur des sockets dans la partie c++ (meme si c'est codé en c++/c)? ya une partie developpement réseau!

  6. #26
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    send prend en paramètre un descripteur, donc la socket correspondante. c'est quoi ce data+sent?
    Peu importe l'ordre ou la place des paramètres (je n'en suis pas encore à les connaître par coeur), ici on parle juste du pointeur vers les données et leur taille. J'aurais dû placer des "..." de chaque côté pour éviter que les pinailleurs ne me tombent dessus...

    ps: quelle différence pour un réseau tcp mode connecté entre [read & write] et [recv & send]?
    S'assurer qu'on ne sera jamais tenté de porter le code vers les sockets Windows, peut-être ?
    A part ça il n'y a sans doute aucune différence, tout étant géré sous forme de descripteur de fichier sous Unix.

    et au fait qu'est ce que fait une discussion sur des sockets dans la partie c++ (meme si c'est codé en c++/c)? ya une partie developpement réseau!
    C'est vrai que c'est limite, mais bon comme on intercale quelques questions de C++, et que ça ne gêne pas de laisser quelques questions de réseau ici, il est préférable de laisser le sujet ici.

  7. #27
    Membre actif Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Points : 274
    Points
    274
    Par défaut
    et c'est laquelle qui permet la portabilité vers les sockets windows?
    et désolé de pinailler mais j'ai pas compris, donc j'ai demandé précision ^^
    merci de ta rép, mais faut penser que des gens postent dans la partie développement réseau qui est bien moins visitée que celle de c++. (j'en suis la preuve)

    votre pinailleur en chef :p

  8. #28
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    C'est send()+recv() qui marche sur tous les sockets, quelle que soit leur nature sous-jacente.

    read()/write() ne marche que sur des descripteurs, donc ne marche avec les sockets que là où les sockets sont des descripteurs (à savoir: Tout système unixoïde/POSIX, mais sûrement pas Win32).

  9. #29
    Membre actif Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Points : 274
    Points
    274
    Par défaut
    N'y a t-til pas un avantage de read/write par rapport a send/recv?
    a part le nombre d'arguments qui sont moins nombreux dasn read/write!
    j'utilise read write en principe mais bon...

  10. #30
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    N'y a t-til pas un avantage de read/write par rapport a send/recv?
    Le résultat sera le même, quel genre d'avantage voudrais-tu avoir ?

    a part le nombre d'arguments qui sont moins nombreux dasn read/write!
    Bah... Il faut juste rajouter un flag (qu'on met toujours à 0)

  11. #31
    Membre actif Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Points : 274
    Points
    274
    Par défaut
    Non, en fait je fais des projets sur des sockets en tcp, et j'utilise read/write.
    et je me demandais comment je pourrais justifier l'utilisation de read/write par rapport a rcv/send.

    c'est tout!

    read et rcv sont tous deux bloquantes?

  12. #32
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    read et rcv sont tous deux bloquantes?
    Oui, il me semble que c'est sur le socket (ou plus généralement sur le descripteur de fichier) qu'il faut paramétrer la notion de blocage / non-blocage. Comme ça peut se faire pour l'entrée standard par exemple, puisque c'est aussi un fichier (toujours sous Unix évidemment).

  13. #33
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    lun4t1k :
    1. Inutile de chercher, tu ne peux.
    2. Oui. Comme dit par Laurent, ça se paramètre sur le socket (ou le descripteur de fichier sous nux).
      La fonction doit être ioctl() sous nux, ioctlsocket() sous Windows.

  14. #34
    Membre actif Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Points : 274
    Points
    274
    Par défaut
    merci a vous!
    autre question: un client envoie 5000 caracteres (ou octets).
    le buffer coté server est suffisament grand pour tout accueillir.
    cependant je ne recois pas tout d'un coup.
    apres chaque read j'affiche le nb d'octets recus, et de tps en tps l'envoi ne se fait pas qu'en une fois. (en tcp mode connecté toujours)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1 octets recus.
    2563 octets recus
    le nb de carctères envoyés par le client est aléatoire et s'échelonne de 1000 a 10000. (souvent aux alentours des 3000)

    d'ou ca pourrait venir? sachant que le client n'envoi qu'une fois et que le serveur ne recoit qu'une fois!
    pourquoi read se bloque?

    ps: c'est la derneire question! ^^

  15. #35
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Les sockets en mode connecté on toute lattitude pour découper leurs packets quand bon leur semble, cela fait partie du standard.
    La seule chose dont tu peux être sur, c'est l'absence de perte de packets, ainsi que l'ordre d'arrivé qui est toujours respecté.

    D'ou cela vient ? Surement des différents buffeurs dans la chaîne réseau (os, cartes, routeurs, ...) qui choisisent la meilleure taille de packet pour être le plus rapide possible.

    D'ailleurs la taille des frames est paramétrable sur les cartes réseau, cependant il n'existe pas à ma connaissance de formule exacte pour connaître la taille de "3000" que tu indiques.

    Pourquoi read se bloque ? Laurent t'as donné la réponse => fonction ioctlsocket ...

  16. #36
    Membre actif Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Points : 274
    Points
    274
    Par défaut
    Par contre je suis désolé je vais en contredire certains, mais j'ai bien peur que ce soit faux que d'affirmer que recv est portable sur windows.

    Source: Prof de réseau!

  17. #37
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    recv n'est pas plus portable que les autres fonctions ; simplement dans 90% des cas ce sont juste des différences de types (int / unsigned int, SOCKET / int, ...) et qui compilent tout de même sur les deux OS sans modification.

  18. #38
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Je confirme que la fonction recv existe bel et bien sur Win32.
    En fait ce n'est autre qu'un alias d'une des fonctions "natives" de Windows sur les sockets. Mais les 2 fonctionnent bien.

  19. #39
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En règle générale Windows fournit toujours de quoi être compatible avec les sockets Berkeley, il reste juste quelques lourdeurs dûes à certaines différences entre Windows et les Unix. Quoiqu'il en soit faire une interface portable par dessus tout ça n'a rien de bien compliqué.

  20. #40
    Membre actif Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Points : 274
    Points
    274
    Par défaut
    En gros il n'y a pas lieu de dire que rcv & send sont portables vers win! (vocabulairement)

    La seule différence que je vois entre read et rcv c'est l'absence du flag sur read.
    (flag que je laisse souvent à 0 pour mes utilisations...)

    Ok merci à vous.
    Bonne soirée à tous!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/07/2014, 18h05
  2. Réponses: 2
    Dernier message: 24/09/2011, 14h20
  3. Ajuster la taille du buffer pour recv
    Par figarojuju dans le forum Réseau
    Réponses: 11
    Dernier message: 04/09/2010, 12h55
  4. Taille de buffer dépassé pour DBMS_LOB
    Par Loizo dans le forum PL/SQL
    Réponses: 10
    Dernier message: 09/02/2009, 17h34
  5. Réponses: 12
    Dernier message: 27/03/2008, 22h01

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