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

Delphi Discussion :

[ICS] Socket à Socket par Buffer


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 39
    Points : 19
    Points
    19
    Par défaut [ICS] Socket à Socket par Buffer
    Salut,
    à partir d'un socket ICS, je récupère ce qui arrive sur un certain port. Je mets ces données dans un Buffer, puis ensuite, graçe à un autre socket, je renvoi ces données vers un autre port et un autre Host.
    Sa à l'air d'a peut près marcher.
    Cependant, après la première reception de données, le logiciel se met à bugger.
    A mon avis il y a quelque chose que je ne fait pas correctement, voir tout peut-être ^^.

    Merci de me donner un petit coup de pouce sur mon code :

    Pour info, pour vérifier ce que je reçois, j'affiche le md5 des données dans un Memo (j'affiche uniquement si le md5 est différent).

    Je déclare les variables de cette manière :
    ABuffer1: TWSocketData;
    a,a1:string;

    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
    procedure TMain.Socket1DataAvailable(Sender: TObject; ErrCode: Word);
    begin
       with Sender as TWSocket do
       try
        Socket1.Receive(ABuffer1,strtoint(Edit4.Text));
         with Socket do
              try
                Addr  := JvIpAdress1.Text;
                Port  := Edit1.Text;
                Proto := 'udp';
                if State = wsClosed then
                  Connect;
                Send(ABuffer1,SizeOf(ABuffer1));
              except
               on E: Exception do
                  Log('Error ' + E.Message);
            end;
          a:=MD5(ABuffer1, sizeof(ABuffer1));
          if(a<>a1) then
            log(a);
          a1:=a;
       except
          on E: Exception do
             Log('Error ' + E.Message);
       end;
    end;
    Merci, A+

  2. #2
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    tu veux dire quoi par 'se met à bugguer' ?

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 39
    Points : 19
    Points
    19
    Par défaut
    Le programme se met à occuper tout le processeur...

  4. #4
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    disons que ce qui me choque un peu dans ton code c'est que tu as mis plein de choses dans l'événement Socket1DataAvailable y compris des choses assez gourmandes en process comme MD5.
    Le problème est que cet évènement se déclenche chaque fois que tu as des nouvelles données disponibles...donc souvent...y compris même si tu n'as pas terminé de faire tout ce que tu as à faire dans cette fonction.

    Pour moi j'ai un soft un peu similaire et j'ai été obligé d'enlever le max de choses de Socket1DataAvailable pour ne garder que la récup. des données (ou presque)

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 39
    Points : 19
    Points
    19
    Par défaut
    Oui, je veux bien, mais le programme se bloque, juste après l'apparition d'un paquet, c'est à dire que Socket1DataAvailable ne s'est executé qu'une seule fois. Enfin, je suppose.

    De plus il bloque également sans le MD5, ni l'affichage dans le memo.

    Sinon, comment devrais-je faire ?

  6. #6
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Je te conseille de faire par étapes.
    Tu fais un prog. qui met les données reçues dans une TStringList à partir du moment où tu clique sur un bouton et qui s'arrète quand tu reclique dessus. Sur ce 2eme clic tu sauves ta TSTringList dans un fichier et tu regardes si ce que tu reçois est OK. Et après tu passes à la suite...

    Tu peux t'inspirer des exemples livrés avec ICS qui sont plutôt bien faits. Pour ton soft tu as un example qui est TnSrv.

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 39
    Points : 19
    Points
    19
    Par défaut
    Ok, merci beaucoup, je vais jeter un coup d'oeil à TnSrv .

    Sinon, si quelqu'un trouve ce qui cloche dans mon code, qu'il me fasse signe

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/09/2007, 13h13
  2. [PHP-JS] Problème de socket, passer par un proxy
    Par Kruggs dans le forum Langage
    Réponses: 1
    Dernier message: 13/07/2007, 01h15
  3. [C]Proxy send sur un socket fermé par un RST
    Par pier* dans le forum Développement
    Réponses: 1
    Dernier message: 14/08/2006, 21h27
  4. Socket, C++ et buffer !
    Par agent007se dans le forum C++
    Réponses: 9
    Dernier message: 18/04/2006, 18h02
  5. [c#] manipuler socket utilisé par autre application
    Par orelero dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/12/2005, 09h25

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