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 :

Indy et communication UDP


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Par défaut Indy et communication UDP
    Bonjour,

    je cherche depuis bientôt une semaine pour tester la communication UDP.
    Apparemment la manière la plus simple est d'utiliser Indy, j'ai donc installer les composants Indy, mais après plusieurs essais je n'arrive toujours pas à faire ce que je veux.
    J'aimerais juste faire deux petites applications, une server et une client, de manière a échanger des infos de l'une vers l'autre. Ca doit pas être si compliqué mais je bloque. Voilà ce que j'ai fait pour le moment si quelqu'un peux m'aider Merci.

    Server:

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdSocketHandle,
      IdUDPServer, IdUDPClient;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        Edit2: TEdit;
        IdUDPServer1: TIdUDPServer;
        procedure Button1Click(Sender: TObject);
        procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
          ABinding: TIdSocketHandle);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    IdUDPServer1.Bindings.Add;
    IdUDPServer1.Binding.IP:='123.0.0.1';
    IdUDPServer1.Binding.Port:=49153;
    Edit2.Text:='IP:'+IdUDPServer1.Binding.IP+' Port:'+inttostr(IdUDPServer1.Binding.Port);
    end;
     
     
    procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    var Line:TStringStream;
    begin
    Line.Create('');
    Edit2.Text:='IP:'+ABinding.IP+' Port:'+inttostr(ABinding.Port);
    Line.CopyFrom(AData,AData.Size);
    Showmessage(Line.DataString);
    end;
     
    end.
    Client:

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Sockets,ScktComp, IdBaseComponent, IdComponent,
      IdUDPBase, IdUDPServer, IdUDPClient;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        Edit2: TEdit;
        IdUDPClient1: TIdUDPClient;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    IdUDPClient1.Host:='123.0.0.1';
    IdUDPClient1.Port:=49153;
    IdUDPClient1.Active:=true;
    IdUDPClient1.Send(Edit2.Text);
     
    Edit1.Text:='IP:'+IdUDPClient1.Host+' Port:'+inttostr(IdUDPClient1.Port);
     
    end;
     
    end.
    Ce n'est qu'un essai bien entendu mais ça ne fonctionne pas et j'ai pas trouvé de sources convenable expliquant le dialogue UDP.

    Please help !!

  2. #2
    Membre expérimenté
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Par défaut
    Citation Envoyé par cbegood Voir le message
    Ce n'est qu'un essai bien entendu mais ça ne fonctionne pas et j'ai pas trouvé de sources convenable expliquant le dialogue UDP.
    as-tu essayé ceci?

  3. #3
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Par défaut
    Ohh merci beaucoup je vais analyser ça mais c'est certainement tous ce qu'il me fallait pour mieux comprendre.

    Merci mille fois.

  4. #4
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Par défaut
    Alors voilà j'ai bien analysé l'exemple donné (UDPServerClient).
    Il y a tout de même un truc que je ne comprend pas et je commence a douter de mes capacités...

    En gros j'ai repris presque tout le code de l'exemple la seule différence c'est que j'envoie du texte et non un nombre (ce qui ne change rien vu qu'il est convertit avant d'être envoyé) et aussi je fixe les adresses et ports dans la procédure de création de la forme au lieu de le faire dans le mode design.

    Et comme par hasard rien ne fonctionne, enfin rien n'est transféré.

    Une chose me semble bizarre dans l'exemple donné, lorsqu'un message est envoyé, le port est chez moi 1995 or on ne le fixe nul part. Est-ce normal?
    Je me demande si mon problème ne viendrais pas de là. Je retape mon code ici ça aidera sans doute d'autres personnes aussi car il y a très peu de discussion et d'info sur la communication UDP (basique).


    Client:

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, Graphics, Controls, Forms, Dialogs, IdWinsock2,   stdctrls,
      SysUtils, Classes, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze,
      IdComponent, IdUDPBase, IdUDPClient, IdStack, ExtCtrls;
     
     
    type
      TForm1 = class(TForm)
        Panel1: TPanel;
        LblHostName: TLabel;
        LblHostAddress: TLabel;
        LblPort: TLabel;
        LblDestination: TLabel;
        LblBufferSize: TLabel;
        Memo1: TMemo;
        BtnSend: TButton;
        IdUDPClient1: TIdUDPClient;
        HostName: TLabel;
        HostAddress: TLabel;
        Port: TLabel;
        Destination: TLabel;
        BufferSize: TLabel;
        IdAntiFreeze1: TIdAntiFreeze;
        procedure FormCreate(Sender: TObject);
        procedure BtnSendClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    const
      RECIEVETIMEOUT=5000;
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Memo1.Text:='';
    HostName.Caption:=IdUDPClient1.LocalName;
    HostAddress.Caption:=GStack.LocalAddress;
    IdUDPClient1.Port:=8090;
    Port.Caption:=IntToStr(IdUDPClient1.Port);
    IdUDPClient1.Host:='123.0.0.1';
    Destination.Caption:=IdUDPClient1.Host;
    BufferSize.Caption:=IntToStr(IdUDPClient1.BufferSize);
    IdUDPClient1.ReceiveTimeout:=RECIEVETIMEOUT;
    end;
     
    procedure TForm1.BtnSendClick(Sender: TObject);
    var
      Msg: String;
      ReceivedString: String;
    begin
      Msg := Memo1.Text;
      Memo1.Clear;
      Memo1.Lines.Add('Sending : ' + Msg);
      IdUDPClient1.Send(Msg);
      ReceivedString := IdUDPClient1.ReceiveString();
      if ReceivedString = '' then
        Memo1.Lines.Add('No response received from the server after ' + IntToStr(IdUDPClient1.ReceiveTimeout) + ' millseconds.')
      else
        Memo1.Lines.Add('Received: ' + ReceivedString)
    end;
     
    end.
    Server:

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, Graphics, Controls, Forms, Dialogs, IdWinsock2, stdctrls,
      SysUtils, Classes, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze,
      IdComponent, IdUDPBase, IdUDPClient, IdStack, IdUDPServer, IdSocketHandle,
      ExtCtrls;
     
     
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        IdUDPServer1: TIdUDPServer;
        Panel1: TPanel;
        LblHostName: TLabel;
        LblHostAddress: TLabel;
        LblPort: TLabel;
        LblBufferSize: TLabel;
        HostName: TLabel;
        HostAddress: TLabel;
        Port: TLabel;
        BufferSize: TLabel;
        IdAntiFreeze1: TIdAntiFreeze;
        procedure FormCreate(Sender: TObject);
        procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
          ABinding: TIdSocketHandle);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Memo1.Clear;
      HostName.Caption := IdUDPServer1.LocalName;
      HostAddress.Caption := GStack.LocalAddress;
      IdUDPServer1.DefaultPort:=8090;
      Port.Caption := IntToStr(IdUDPServer1.DefaultPort);
      BufferSize.Caption := IntToStr(IdUDPServer1.BufferSize);
      IdUDPServer1.Active := True;
    end;
     
    procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    var
      DataStringStream: TStringStream;
      s: String;
    begin
      DataStringStream := TStringStream.Create('');
      try
        DataStringStream.CopyFrom(AData, AData.Size);
        Memo1.Lines.Add('Received "' + DataStringStream.DataString + '" from ' + ABinding.PeerIP + ' on port ' + IntToStr(ABinding.PeerPort));
        s := 'Replied from ' + IdUDPServer1.LocalName + ' to "' + DataStringStream.DataString + '"';
        ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s));
      finally
        DataStringStream.Free;
      end;
    end;
     
    end.
    Merci

  5. #5
    Membre expérimenté
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Par défaut
    Citation Envoyé par cbegood Voir le message
    Alors voilà j'ai bien analysé l'exemple donné (UDPServerClient).
    Il y a tout de même un truc que je ne comprend pas et je commence a douter de mes capacités...

    En gros j'ai repris presque tout le code de l'exemple la seule différence c'est que j'envoie du texte et non un nombre (ce qui ne change rien vu qu'il est convertit avant d'être envoyé) et aussi je fixe les adresses et ports dans la procédure de création de la forme au lieu de le faire dans le mode design.

    Et comme par hasard rien ne fonctionne, enfin rien n'est transféré.
    Tout d'abord, l'exemple que je vous ai indiqué a été développé sous Indy9
    Ayant Indy10, je me retrouve sur le problème qui est que la plupart des démos d'Indy9 n'ont pas été traduites sous Indy10 (cf http://www.indyproject.org/demos/index.html)
    Néanmoins j'ai essayé de porter la démo Indy9 sur Indy10 en faisant le minimum pour fonctionner .. et çà a l'air de fonctionner
    Vous trouverez la démo ici
    Il y a au moins 2 choses à régler pour que çà soit 100% Ok:
    1. le transtypage d'un TIdBytes: array of bytes dans le type voulu (moi j'ai tenté le String(AData) mais sans fouiller)
    2. le fait que ma VCL Indy est incompatible avec le code source, ce qui provoque un systématique 'la méthode UDPServerUDPRead référencée par UDPServer.OnUDPRead a une liste de paramètes incompatibles. Voulez-vous retirer la référence?' En répondant 'non' à la question on arrive à compiler mais ce pb doit être réglé autrement. Peut-être en installant un nouveau package..

    J'espère que çà sera pour vous une base de travail.
    Cordialement

  6. #6
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Par défaut
    Mon problème ne vient pas de la version d'indy car j'ai la version 9 et pas la 10 donc la démo fonctionne le seul soucis c'est que en la recopiant pour pouvoir modifier quelque peut certaine ligne, cela ne fonctionne plus et je ne vois pas d'où viens l'erreur.
    En gros tous ce que j'ai fait c'est du copier coller donc je pense que le problème doit venir d'autre part que le code mais ou ???
    J'aimerais savoir comment, lorsque j'utilise la demo d'indy9 qui fonctionne, le port de l'UDPClient est déterminer pour l'envoi, car d'après mes tests il en détermine un mais pas celui du code (8090).

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

Discussions similaires

  1. erreur sur mon prog c sous linux (communication udp)
    Par oumar_ba dans le forum Linux
    Réponses: 3
    Dernier message: 13/11/2009, 20h04
  2. Communication UDP bloquante
    Par MeWaa dans le forum C
    Réponses: 1
    Dernier message: 19/10/2009, 21h08
  3. Communication UDP sans ouverture de port
    Par Thixomag dans le forum Qt
    Réponses: 4
    Dernier message: 24/02/2009, 12h25
  4. Indy 10 & protocole UDP
    Par Hiker's dans le forum Web & réseau
    Réponses: 2
    Dernier message: 22/01/2009, 14h24
  5. Libérer le port en cours d'une communication UDP
    Par wagui26 dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 10/12/2008, 11h40

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