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

Web & réseau Delphi Discussion :

Probleme envoye Stream avec TIdUDPClient


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 53
    Par défaut Probleme envoye Stream avec TIdUDPClient
    Salut,

    J'essaie d'envoyé un stream avec TIdUDPClient vers TIdUDPServer.

    Le TIdUDPClient me renvoie une erreur "Taille de package trop large", pourtant la taille de stream est de 500Ko.

    Est ce que vous avez une solution pour ça?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    Avec un TClientSocket (TCP IP), la méthode SendStream va émettre ton stream découpé en paquet de 4Ko, c'est le code de la RTL qui lit le Stream par bout et appel send avec ce petit paquet de 4ko

    Comme l'émission des 4Ko est rapide et rapproché, le receveur ne reçoit pas forcément 4Ko aussi nettement découpé !

    J'ai fait un programme en Delphi 5 où j'envoyais 40 chaines une par une d'une longueur de 40 caractères et cela dans une boucle (envoi TRES TRES rapproché)
    En face un programme en VSC++, recevait presque 20 chaines d'un coup, leur programme n'avait pas été prévu pour découper un buffer et d'y retrouver plusieurs chaines dans le même buffer
    J'ai du adapter mon programme pour ralentir l'émission de ces trames pour que le programme C++ les recoivent bien une par une !
    J'ignore d'où venait ce regroupement :
    est-ce à cause tu TServerSocket et son système de message ?
    est-ce windows ?
    est-ce la carte réseau ?
    ...

    Même entre un TClientSocket qui envoie un Stream de 1Mo, le TServerSocket en face reçoit des paquets de 8Ko alors que le code Delphi lui emet 4ko par 4Ko, magie du TCP IP qui regroupe !!!

    C'est comme cela qu'on se retrouve avec de buffer fragmenté en paquet de 8Ko qu'il faut concaténer, évidemment, si l'on envoie plusieurs Stream à la suite, il faut avoir un protocol applicatif qui émet ses propres STX\ETX permettant de savoir où commence et fini un stream


    Peut-être que le TIdUDPClient ne fragmente pas automatiquement le Stream et qu'il faut toi même émettre au maximum 64Ko :

    UDP datagram IPv4 : 65,507 bytes
    UDP datagram IPv6 : 65,527 bytes
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 53
    Par défaut
    Donc d'aprés ce que je compris, il faut que je crée une protocole qui decoupe le 500ko en 64Ko.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    Si le TIdUDPClient ne le fait pas (ce qui m'étonne), oui cela serait une solution !

    Mais il me semble que le SendBuffer fait une fragmentation *, il y a peut-être une option a vérifier avant de te lancer dans une uzinagaz

    * si l'on fouille le code bien tordu de Indy, on fini sur GStack.SendTo puis en cherchant l’implémentation selon OS, on trouve un GetProcAddress sur sendto des API Windows

    The sendto function is used to write outgoing data on a socket. For message-oriented sockets, care must be taken not to exceed the maximum packet size of the underlying subnets, which can be obtained by using getsockopt to retrieve the value of socket option SO_MAX_MSG_SIZE. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned and no data is transmitted.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    moi je dirais plutôt 1472 octets

    si votre infrastructure de couche 2 est de l'ethernet alors quoi qu'il arrive vos paquets de couche 4 seront forcément transmis en trames de 1500 octets maximum.
    Afin d'éviter la segmentation dans ce cas il vaut mieux produire des paquets UDP ne dépassant pas 1472 octets de payload
    http://forum.macbidouille.com/lofive...hp/t64304.html
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    moi je dirais plutôt 1472 octets
    1472, c'est la taille max d'une trame ethernet "standard" sur ethernet. Et encore, cette taille max diminue si tu es dans un tunnel GRE.

    Sur fibre, c'est 4096, sur loopback, c'est "implementation dependant".

    La taille max d'une trame de niveau 2 n'est pas le problème de la couche 4. En effet, la couche 4 repose sur IP qui lui, sait fragmenter et défragmenter et connait la taille max des trames du protocole d'en dessous.

    Par contre, la taille d'une trame UDP est donnée dans le header UDP sur 2 octets (16 bits), donc la taille max des données utilisateur en UDP est de 65535 octets
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. Probleme - Envoyer un e-mail avec PHP
    Par Mr Adnanox dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 03/03/2009, 02h59
  2. Réponses: 6
    Dernier message: 04/04/2003, 15h28
  3. [Kylix] Probleme de séparateur avec Kylix2 ?
    Par jeanphy dans le forum EDI
    Réponses: 4
    Dernier message: 10/02/2003, 16h41
  4. Réponses: 12
    Dernier message: 23/10/2002, 11h56
  5. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26

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