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 :

Rechercher un PC particulier parmi une liste d'IP sur un réseau local


Sujet :

Web & réseau Delphi

  1. #1
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut Rechercher un PC particulier parmi une liste d'IP sur un réseau local
    Salut

    Je me suis remis a programmer mon chat grace aux composants Indy 10. Ce chat fonctionne en Serveur/Client, et donc, pour qu'un client se connecte au serveur, il doit connaitre l'IP de ce serveur.

    J'ai une liste d'IP parmi laquelle se trouve mon serveur, et j'amerais trouver ce serveur, sans tenter une connection du client a chaque IP (trop long). Le serveur est toujours le même PC. Je me demandais donc comment retrouver ce PC grace aux IP ...

    Serait il possible de récuperer le nom de l'ordinateur de chaque IP ? Ou alors l'adresse MAC pour chaque IP ? Ou n'importe quelle info qui serait différente d'un PC a l'autre ? Que me conseillez vous ? Quelle est la solution la plus rapide, la plus simple, la plus efficace ?

    Merci d'avance pour vos réponses !

    A+

    Mick605

  2. #2
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut


    ce que moi j'ai utilisé dans un cas similaire :
    • un client UDP sur le client
    • un serveur UDP sur le serveur
    • le client envoie un message broadcast à tous les PC du réseau
    • le serveur reconnait le message et lui répond (avec par exemple le numéro de port pour le chat, ou tout autre paramètre)
    • le client sait alors quel est le pc serveur.

    simple, rapide et efficace.

    c'est à peu près le même principe pour le protocole DHCP

  3. #3
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    Merci pour ta réponse, ca a l'air d'être ce que je cherche
    Pourrais tu m'expliquer (vite fait) comment je pourrais envoyer un message broadcast ? Je n'ai aucune notion de UDP, je viens juste de rechercher, et j'ai compris quelques trucs, mais je n'ai pas trouvé d'exemple de code ...

    Si t'as un exemple, je suis preneur ...

    En tout cas merci, ca va surement m'aider ca !

    a+

    Mick605

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 787
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 787
    Points : 13 440
    Points
    13 440
    Par défaut
    Sur le même principe, il y a aussi les mailslots avec l'avantage qu'il n'y a pas besoin d'ouvrir de ports.

  5. #5
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par mick605 Voir le message
    Pourrais tu m'expliquer (vite fait) comment je pourrais envoyer un message broadcast ? Je n'ai aucune notion de UDP, je viens juste de rechercher, et j'ai compris quelques trucs, mais je n'ai pas trouvé d'exemple de code ...

    Si t'as un exemple, je suis preneur ...
    ce n'est pas bien sorcier, il suffit d'utiliser les composants TIdUDPClient et TIdUDPServer.
    pour envoyer le broadcast tu utilises la méthode Broadcast du client, sur le serveur, c'est dans l'évènement OnUDPServerRead que tu gère la réception et le traitement des messages reçus.
    j'essaierai de poster un code conséquent dès que possible.

    Citation Envoyé par Andnotor Voir le message
    Sur le même principe, il y a aussi les mailslots avec l'avantage qu'il n'y a pas besoin d'ouvrir de ports.
    pourrais-tu nous en dire plus ?

  6. #6
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par evarisnea Voir le message
    ce n'est pas bien sorcier, il suffit d'utiliser les composants TIdUDPClient et TIdUDPServer.
    pour envoyer le broadcast tu utilises la méthode Broadcast du client, sur le serveur, c'est dans l'évènement OnUDPServerRead que tu gère la réception et le traitement des messages reçus.
    j'essaierai de poster un code conséquent dès que possible.
    Parfait, je vais tester ca de suite ...

    Andnotor > Pareil que evarisnea : t'as plus d'infos ? En sachant que le fait d'ouvrir des ports ne me gene pas ... Quels sont les avantages et les inconvénients de cette méthode ?

    Merci a vous deux, a+

    Mick605

    Edit :

    Pour info, pour créer le serveur, il faut ajouter dans les clauses Uses : IdGlobal et IdSocketHandle, sinon TBytes et TIdSocketHandle ne seront pas reconnus ....

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 787
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 787
    Points : 13 440
    Points
    13 440
    Par défaut
    Tout est

    J'ajouterais à cet article que les Mailslots ne sont pas dépendants d'un protocole et fonctionnent aussi bien en IP, IPX, NetBios, etc.
    Le revers de la médaille est que le message sera envoyé en utilisant chaque protocole disponible.
    Par conséquent, si les stations ont toutes deux IP + NetBios installés, l'application cliente recevra 2 fois le message. C'est donc bien de prendre l'habitude de commencer le message par un identificateur (valeur aléatoire pouvant le cas échéant être testée).

  8. #8
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Merci Andnotor

    Mais je pense que je vais rester quand meme avec UDP, ca me semble plus simple, en plus, j'ai déja commencé ...

    Par contre, j'ai réussi a faire communiquer deux applications sur le meme PC, mais pas deux applications sur 2 PC distants. Si vous avez un exemple, je le veux bien, ou un tuto, parce que sur internet, je ne trouve pas ce que je veux ...
    Je n'arrive pas non plus a envoyer un message de Serveur vers client ...

    Merci, et A+

    Mick605

  9. #9
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Bon, j'ai testé plusieurs trucs, et pour l'instant, j'arrive a envoyer des données du client vers le serveur sans probleme, mais dans l'autre sens, je bloque.

    Le point le plus genant est qu'il n'y a pas d'évenement OnUDPRead pour le IdUDPClient. J'ai essayé ReceiveString, ReceiveBuffer, mais elles bloquent le programme. Alors j'ai créé un thread avec ReceiveBuffer, mais je ne recois toujours rien. Coté Serveur, j'envoie mes données avec Send. Je me sert du parametre ABinding pour connaitre l'IP du client.

    Je pourrais aussi mettre un serveur et un client sur chaque form. Quelle solution me conseillez vous ? Avez vous un exemple d'envoi de données de serveur vers client ?

    Merci d'avance, et a+

    Mick605

  10. #10
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    voilà un petit exemple:

    sur la première form TForm1 (application cliente sur pc1):
    - créer le gestionnaire d'évènement OnCreate
    - ajouter un TLabel
    - ajouter un TEdit
    - ajouter un Bouton et créer son gestionnaire d'évènement OnClick
    - ajouter un TIdUDPClient

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient;
     
    type
      TForm1 = class(TForm)
        IdUDPClient1: TIdUDPClient;
        Label1: TLabel;
        Edit1: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      sReponse:String;
    begin
      //envoyer un broadcast pour retrouver le serveur
      //le port a utiliser est le port sur lequel le serveur udp ecoute
      IdUDPClient1.Broadcast('RECHERCHE-SERVEUR', 55555);
      //attendre la reponse pendant un certain temps, ici on attends 1s (pour un reseau local c'est largement suffisant !!!)
      sReponse := IdUDPClient1.ReceiveString(1000);
      //si une reponse a ete recue, verifier qu'elle contient la chaine de caracteres 'JE-SUIS-SERVEUR'
      if Pos('JE-SUIS-SERVEUR', sReponse) > 0 then
        //afficher ce qui suit la chaine 'JE-SUIS-SERVEUR'
        Edit1.Text := Copy( sReponse, Length('JE-SUIS-SERVEUR') + 1, Length(sReponse) - Length('JE-SUIS-SERVEUR'))
      //sinon ce n'est pas le serveur
      else
        Edit1.Text := 'SERVEUR NON TROUVE';
     
      //fermeture de la liaison
      IdUDPClient1.Binding.CloseSocket();
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      //init des composants visuels
      Label1.Caption := 'Serveur :';
      Edit1.Text := '';
      Button1.Caption := 'Chercher';
    end;
     
    end.

    sur la seconde form TForm2 (application serveur sur pc2):
    - créer le gestionnaire d'évènement OnCreate
    - ajouter un TIdUDPServer et créer son gestionnaire d'évènement OnUDPRead

    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
    unit Unit2;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, IdStack, IdSocketHandle;
     
    type
      TForm2 = class(TForm)
        IdUDPServer1: TIdUDPServer;
        procedure FormCreate(Sender: TObject);
        procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; AData: TBytes;
          ABinding: TIdSocketHandle);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form2: TForm2;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm2.FormCreate(Sender: TObject);
    begin
      //configuration du serveur
      IdUDPServer1.DefaultPort := 55555;//le numero du port d'ecoute
      //activation du serveur
      IdUDPServer1.Active := True;
    end;
     
    procedure TForm2.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
      AData: TBytes; ABinding: TIdSocketHandle);
    var
      sMessage: String;
    begin
      sMessage := StringOf( AData );
      //si le message contient 'RECHERCHE-SERVEUR', renvoyer 'JE-SUIS-SERVEUR'+IP
      if Pos('RECHERCHE-SERVEUR', sMessage) > 0 then
        ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, BytesOf( 'JE-SUIS-SERVEUR'+ GStack.LocalAddress ));
      //sinon rien
    end;
     
    end.

  11. #11
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Oula, tu as fait ca bien

    Merci, je pense savoir d'ou vient mon erreur, je vais tester et verifier ! Encore merci. (je reviendrai mettre résolu)
    A+

    Mick605

    Edit :

    Je viens de tester ton code. Je ne sais pas pourquoi, je n'arrive toujours pas a recevoir de message avec le client. Les deux applis sont sur le meme PC. J'ai fait quelques modifs, a mon avis, tu as Indy 9, parce que quelques petits trucs different :

    Client :
    Mettre BroadCastEnabled et Active a true sur le compo IdUDPClient

    Serveur :
    Mettre BroadCastEnabled a true sur le compo IdUDPServer
    Déclaration de IdUDPServer1UDPRead :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
      ABinding: TIdSocketHandle);
    Avec ces quelques modifs, j'ai réussi a recevoir le Broadcast sur le serveur, mais toujours pas de réponse sur le client. J'ai enlevé les conditions pour savoir si le message contient 'JE-SUIS-SERVEUR' , pour voir si le client recevais n'importe quoi, mais il ne recois rien. As tu une idée ?


    Edit 2 :
    BytesOf et StringOf ne sont pas reconnus ...

  12. #12
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Au pire, je ne suis pas obligé de répondre avec le serveur, je peux mettre un IdUDPClient sur le serveur ...

    Mais j'ai un autre probleme, du a mon réseau. Le campus sur lequel je suis est composé de plusieurs résidences. Chaque résidence contient un réseau relié par ethernet. Ces réseaux sont reliés entre eux (IP : 10.20X.X.X). Avec ce simple réseau, nous n'avons pas acces a internet. Pour avoir acces a internet, tout les PCs sont connectés a un VPN, un réseau virtuel (IP : 10.31.X.X).

    Le chat, et toutes les applis en réseau (jeux ...) fonctionnent grace au VPN. Mais quand je fais un broadcast, le message est envoyé sur le réseau des résidences, et pas sur le VPN. J'ai remarqué ca parce que quand je fais tourner un client et un serveur sur mon PC, je récupere une IP du genre : 10.204.X.X

    Donc, comment faire pour envoyer le broadcast sur le réseau VPN ?

    Merci

  13. #13
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par mick605 Voir le message
    Edit :

    Je viens de tester ton code. Je ne sais pas pourquoi, je n'arrive toujours pas a recevoir de message avec le client. Les deux applis sont sur le meme PC. J'ai fait quelques modifs, a mon avis, tu as Indy 9, parce que quelques petits trucs different :

    Client :
    Mettre BroadCastEnabled et Active a true sur le compo IdUDPClient

    Serveur :
    Mettre BroadCastEnabled a true sur le compo IdUDPServer
    Déclaration de IdUDPServer1UDPRead :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
      ABinding: TIdSocketHandle);
    Avec ces quelques modifs, j'ai réussi a recevoir le Broadcast sur le serveur, mais toujours pas de réponse sur le client. J'ai enlevé les conditions pour savoir si le message contient 'JE-SUIS-SERVEUR' , pour voir si le client recevais n'importe quoi, mais il ne recois rien. As tu une idée ?
    pour BroadCastEnabled, le code fourni marche sans positionner celui-ci à True. En fait en regardant dans les sources indy
    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
    procedure TIdSocketHandle.Broadcast(const AData: TIdBytes; const APort: TIdPort;
      const AIP: String = '');
    var
      LIP: String;
    begin
      LIP := Trim(AIP);
      if LIP = '' then begin
        LIP := '255.255.255.255'; {Do not Localize}
      end else begin
        LIP := GStack.ResolveHost(LIP, IPVersion);
      end;
      SetBroadcastFlag(True);
      SendTo(LIP, APort, AData);
      BroadcastEnabledChanged;
    end;
    il semble que lorsque la méthode Broadcast est utilisée, ce flag soit positionné le temps de faire le broadcast.

    le code utilise Indy10, pas 9.

    pourrais-tu poster le code que tu utilises? et quelle version d'Indy utilises-tu ?


    Citation Envoyé par mick605 Voir le message
    Edit 2 :
    BytesOf et StringOf ne sont pas reconnus ...
    cf D2009

    Citation Envoyé par mick605 Voir le message
    Au pire, je ne suis pas obligé de répondre avec le serveur, je peux mettre un IdUDPClient sur le serveur ...
    ... et en mettre un de plus sur le Client ...

    Citation Envoyé par mick605 Voir le message
    Donc, comment faire pour envoyer le broadcast sur le réseau VPN ?

    Merci
    peut être voir au niveau de la configuration du VPN ? en principe, les requêtes broadcast sont droppées par les routeurs, mais ne connaissant pas ton architecture réseau, je ne peux me prononcer. sinon peut être ouvrir une discussion dans le forum réseau ?

  14. #14
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par evarisnea Voir le message
    pour BroadCastEnabled, le code fourni marche sans positionner celui-ci à True. En fait en regardant dans les sources indy
    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
    procedure TIdSocketHandle.Broadcast(const AData: TIdBytes; const APort: TIdPort;
      const AIP: String = '');
    var
      LIP: String;
    begin
      LIP := Trim(AIP);
      if LIP = '' then begin
        LIP := '255.255.255.255'; {Do not Localize}
      end else begin
        LIP := GStack.ResolveHost(LIP, IPVersion);
      end;
      SetBroadcastFlag(True);
      SendTo(LIP, APort, AData);
      BroadcastEnabledChanged;
    end;
    il semble que lorsque la méthode Broadcast est utilisée, ce flag soit positionné le temps de faire le broadcast.
    Ok...

    Citation Envoyé par evarisnea Voir le message
    le code utilise Indy10, pas 9.
    Tiens, c'est bizarre, moi je suis aussi sur Indy 10, pourtant la déclaration de UDPServerUDPRead est différente . Je suis sur D2005 moi, voila le code :

    Serveur :
    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
    unit Serv;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdGlobal, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer,
      IdStack, IdSocketHandle, StdCtrls;
     
    type
      TForm1 = class(TForm)
        IdUDPServer1: TIdUDPServer;
        Label1: TLabel;
        procedure IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
          ABinding: TIdSocketHandle);
        procedure FormCreate(Sender: TObject);
     
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      //configuration du serveur
      IdUDPServer1.DefaultPort := 55555;//le numero du port d'ecoute
      //activation du serveur
      IdUDPServer1.Active := True;
    end;
     
     
    procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
      ABinding: TIdSocketHandle);
    var
      sMessage: String;
    begin
      Label1.Caption:=Label1.Caption+' +1';
        ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, BytesOf( 'JE-SUIS-SERVEUR'+ GStack.LocalAddress ));
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    unit Uclie;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient;
     
    type
      TForm1 = class(TForm)
        IdUDPClient1: TIdUDPClient;
        Label1: TLabel;
        Edit1: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      sReponse:String;
    begin
      //envoyer un broadcast pour retrouver le serveur
      //le port a utiliser est le port sur lequel le serveur udp ecoute
      IdUDPClient1.Broadcast('RECHERCHE-SERVEUR', 55555);
      //attendre la reponse pendant un certain temps, ici on attends 1s (pour un reseau local c'est largement suffisant !!!)
      sReponse := IdUDPClient1.ReceiveString(1000);
     
      Edit1.Text:=sReponse;
     
      //fermeture de la liaison
      IdUDPClient1.Binding.CloseSocket();
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      //init des composants visuels
      Label1.Caption := 'Serveur :';
      Edit1.Text := '';
      Button1.Caption := 'Chercher';
    end;
     
    end.



    ... et en mettre un de plus sur le Client ...
    Exact, mais tout les codes que j'ai vu (enfin, le peu que j'ai vu) faisait comme ca


    peut être voir au niveau de la configuration du VPN ? en principe, les requêtes broadcast sont droppées par les routeurs, mais ne connaissant pas ton architecture réseau, je ne peux me prononcer. sinon peut être ouvrir une discussion dans le forum réseau ?
    Ok, je vais aller voir ca ...

  15. #15
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par mick605 Voir le message
    Tiens, c'est bizarre, moi je suis aussi sur Indy 10, pourtant la déclaration de UDPServerUDPRead est différente . Je suis sur D2005 moi
    ok, certainement l'un de nous utilise une version plus ou moins récente que l'autre.

    au niveau du serveur, essaye ainsi pour vérifier l'envoi du message par le serveur, les 2 application étant lancées sur le même poste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
      ABinding: TIdSocketHandle);
    var
      sMessage: String;
    begin
      Label1.Caption:=Label1.Caption+' +1';
        ABinding.SendTo('127.0.0.1', ABinding.PeerPort, BytesOf( 'JE-SUIS-SERVEUR'+ GStack.LocalAddress ));
    end;
    je remarque que tu utilises BytesOf, comment t'y es-tu pris ?

  16. #16
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Cool ! Super ! Ca marche au moins avec 127.0.0.1 . Que me conseillerait tu de faire maintenant ?

    Pour le BytesOf, je me doutais que tu me poserais la question : Je me la suis fait moi meme ^^ !

  17. #17
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par mick605 Voir le message
    Cool ! Super ! Ca marche au moins avec 127.0.0.1 . Que me conseillerait tu de faire maintenant ?
    j'aurais presque espéré que ca ne marche pas, car du coup je ne sais trop quoi faire. essaie en mode débogage de vérifier la valeur de Binding.PeerIP, en testant sur le même pc et sur des pc différents. tu peux aussi augmenter le temps d'attente pour la réception de la réponse par le client, mais bon, 1s c'est déjà beaucoup ...

  18. #18
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    J'AI COMPRIS !
    En fait, avec le serveur, le parametre ABinding me renvoie l'adresse IP du réseau local, et non du VPN, alors que GStack.LocalAdress renvoie bien celle du VPN ... Assez bizarre, la logique voudrait que les deux méthodes renvoient les deux memes IP. Donc, quand je demande au serveur d'envoyer un message au client, il se sert de l'IP du réseau, alors qu'il devrait utiliser l'IP du VPN.

    Alors j'ai contourné le probleme : dans le client, je récupere l'adresse VPN avec LocalAdress, et je l'envoie comme Data en broadcast. Le serveur recoit le Data, le convertit et s'en sert d'IP pour envoyer son message. Le client récupere bien le message, et l'IP du serveur dans le Data.

    J'ai maintenant testé avec le client sur un autre PC. Le broadcast ne marche toujours pas, par contre, si le client rentre l'IP VPN du serveur "en dur", le serveur recoit bien le message, et y réponds sans probleme.

    Donc le seul probleme a présent, est de pouvoir envoyer un broadcast sur le VPN, ou alors de pouvoir choisir une plage d'IP a "broadcaster" (tres francais tout ca ^^)

    Au pire, comme j'ai une liste d'IP, je peux tres bien envoyer le message a chaque IP ... bourrin, mais quand j'ai pas de solution, faut que j'en invente une !

    Sinon, qu'est ce qu'il se passe si :
    Le client envoie un message
    Le serveur recoit
    Le serveur envoie la réponse AVANT que le client utilise ReceiveString ?

    Enfin, ca me fait plaisir, parce que j'ai au moins une solution de secours pour mon probleme ! Merci a toi, et a+

    Mick605

  19. #19
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par mick605 Voir le message
    J'AI COMPRIS !
    En fait, avec le serveur, le parametre ABinding me renvoie l'adresse IP du réseau local, et non du VPN, alors que GStack.LocalAdress renvoie bien celle du VPN ... Assez bizarre, la logique voudrait que les deux méthodes renvoient les deux memes IP. Donc, quand je demande au serveur d'envoyer un message au client, il se sert de l'IP du réseau, alors qu'il devrait utiliser l'IP du VPN.
    allez je l'avoue, je n'ai pas très bien compris ...

    Citation Envoyé par mick605 Voir le message
    Au pire, comme j'ai une liste d'IP, je peux tres bien envoyer le message a chaque IP ... bourrin, mais quand j'ai pas de solution, faut que j'en invente une !
    pour quelques pc seulement c'est faisable, mais que se passera-t-il si les choses évoluent? si les adresses changent? etc.

    Citation Envoyé par mick605 Voir le message
    Sinon, qu'est ce qu'il se passe si :
    Le client envoie un message
    Le serveur recoit
    Le serveur envoie la réponse AVANT que le client utilise ReceiveString ?
    ce cas est pratiquement impossible à mon avis, car dès émission du message, le client se met à l'écoute (attente de la réponse). mais s'il survenait, eh bien le message serait perdu car IdUDPClient.Binding.CloseSocket ferme le socket qui écoutait sur le port utilisé pour envoyer la requête au serveur.

    Citation Envoyé par mick605 Voir le message
    Enfin, ca me fait plaisir, parce que j'ai au moins une solution de secours pour mon probleme ! Merci a toi, et a+

    Mick605


    une idée à tester : si j'ai bien compris, le serveur a plusieurs adresses IP? essaie au niveau du UDPServer de la rajouter dans la propriété Bindings.

  20. #20
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    allez je l'avoue, je n'ai pas très bien compris ...
    Ouais c'est pas tres clair, mais a la fois, c'est vraiment la m*rde le réseau qu'ils nous ont mis en place !

    Donc je reprends vite fait :

    Tu as vu le post dans lequel j'explique qu'il y a un réseau Ethernet et un réseau VPN ? Ben en fait, chaque PC est a la fois connecté sur les deux réseaux. Donc chaque PC a deux IP, celle du VPN et l'autre ... Le client et le serveur ont ces 2 IP. Et, pour pouvoir communiquer entre ces PCs, il faut absolument utiliser l'IP VPN.

    Or, le parametre ABinding du UDPServeurUDPRead (le parametre de l'évenement OnRead du serveur) contient une IP du client, tu es d'accord ? C'est ABinding.PeerIP . Mais cette IP n'est pas celle du VPN, donc on ne peut rien faire grace a ca. On est obligé d'avoir l'IP VPN pour communiquer entre 2 PCs. Donc, j'ai rusé pour envoyer cette fameuse IP VPN.

    Par contre, je pense que le broadcast est envoyé aux IP du réseau local, et non pas a celle du VPN, c'est pour ca que personne ne recoit ce message.




    pour quelques pc seulement c'est faisable, mais que se passera-t-il si les choses évoluent? si les adresses changent? etc.
    Les adresses ne changent pas, mais je peux avoir beaucoup de PC ! Vendredi soir yen avait 170, alors imagine en semaine ! Mais bon, meme si ca prends 2 min, ca va. Mais ca enleve tout l'interet du Broadcast.




    ce cas est pratiquement impossible à mon avis, car dès émission du message, le client se met à l'écoute (attente de la réponse). mais s'il survenait, eh bien le message serait perdu car IdUDPClient.Binding.CloseSocket ferme le socket qui écoutait sur le port utilisé pour envoyer la requête au serveur.
    Oui, mais c'étais dans un autre cas : par exemple le client envoie le message, fait des calculs relativement longs et fait ReceiveString. Mais c'est bon, tu as répondu a ma question

    une idée à tester : si j'ai bien compris, le serveur a plusieurs adresses IP? essaie au niveau du UDPServer de la rajouter dans la propriété Bindings.
    A quoi sert cette propriété ?

    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [2008] Connecter une application à une base SQL située sur un réseau local
    Par ArtherKing dans le forum Administration
    Réponses: 13
    Dernier message: 05/04/2015, 10h00
  2. Réponses: 2
    Dernier message: 16/05/2013, 12h26
  3. Réponses: 6
    Dernier message: 26/07/2012, 10h28
  4. Remonter une chaîne de proxy sur un réseau local
    Par pitispike dans le forum Réseau
    Réponses: 1
    Dernier message: 19/05/2011, 15h43
  5. Liste des machines sur un réseau local (tout le réseau de Win)
    Par Lucas Panny dans le forum Web & réseau
    Réponses: 5
    Dernier message: 01/02/2009, 02h11

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