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 :

Problème de connexion entre client et serveur / Erreur de socket #10061 Connexion refusée.


Sujet :

Web & réseau Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut Problème de connexion entre client et serveur / Erreur de socket #10061 Connexion refusée.
    Salut tous le monde j'essaye de faire une simple application de chat en utilisant mon adresse IP publique comme adresse de mon serveur (j'utilise le host de no-ip puisque mon adresse publique est dynamique) et je reçois toujours l'erreur suivante du côté du client : Erreur de socket #10061 Connexion refusée. sachant que j'ai établi la règle de NAT (Network Adress Translation) dans mon routeur et biensure j'utilise le même port sur le client et le serveur. Alors comment y remédier à cette erreur. Voila le code source du client et serveur.

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
      IdTCPClient, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Edit2: TEdit;
        Button1: TButton;
        Button2: TButton;
        IdTCPClient1: TIdTCPClient;
        Shape1: TShape;
        Edit3: TEdit;
        Button3: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    IdTCPClient1.Port:= strtoint(edit2.text);(* spécifier le port*)
    IdTCPClient1.Host:=Edit1.Text; (* Spécifier l'adresse IP du serveur.*)
    IdTCPClient1.connect; (* demander d’établir une connexion*)
    Shape1.Brush.Color := clblue;(* Brush Spécifie la couleur et le motif utilisés pour remplir le contrôle forme.*)
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    IdTCPClient1.Disconnect; (* se déconnecter*)
    Shape1.Brush.Color := clred;
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    IdTCPClient1.WriteLn(edit3.Text); (* envoyer un message de type string à laconnexion courante *)
    end;
     
    end.
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdBaseComponent, IdComponent, IdTCPServer, ExtCtrls, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Label1: TLabel;
        Edit1: TEdit;
        Label2: TLabel;
        Edit2: TEdit;
        Button1: TButton;
        Button2: TButton;
        Shape1: TShape;
        IdTCPServer1: TIdTCPServer;
        Memo1: TMemo;
        Button3: TButton;
        Edit3: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure IdTCPServer1Connect(AThread: TIdPeerThread);
        procedure IdTCPServer1Execute(AThread: TIdPeerThread);
        procedure Button3Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    IdTCPServer1.DefaultPort:= strtoint(edit1.Text);
    IdTCPServer1.Active := true; (*ouvre la une connexion d'écoute qui rend le socketattentif aux demandesdes clients.*)
    edit2.text:= IdTCPServer1.localname;(*localname Indique le nom du système local.*)
    Shape1.Brush.Color := clblue;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    IdTCPServer1.Active := false; (* se déconnecter*)
    Shape1.Brush.Color := clred;
    end;
     
    procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
    begin
    memo1.Lines.Add ('Connecter de: ' +AThread.Connection.Socket.Binding.PeerIP);
    end;
     
    procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    var text:string;
    begin
    text :=athread.Connection.readln();
    memo1.Lines.add( athread.Connection.socket.Binding.peerIp+ text);
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    var
      Count: Integer;
      List : TList;
    begin
     List := IdTCPServer1.Threads.LockList;
        try
          for Count := 0 to List.Count -1 do
               begin
    TIdPeerThread(List.Items[Count]).Connection.WriteLn('');//write the command to the client
                    TIdPeerThread(List.Items[Count]).Connection.WriteLn('edit3.text');
                end;
     
        finally
            IdTCPServer1.threads.UnlockList;
    end;
    end;
    end.

  2. #2
    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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    Le client et le serveur sont sur la même machine ou bien sur le même réseau interne ?

    Si oui, probablement une farce du NAT Hairpinning
    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
    .

  3. #3
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut
    oui les deux sont dans la même machine mais selon mes connaissance ça ne pose aucun problème et je vais te donner un exemple très connu le RAT tu peux exécuter le serveur et le client dans la même machine et tu auras une connexion entre les deux !

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Salut,

    Je ne peux pas tester ton code du serveur, cependant dans de vieilles docs j'ai retrouvé ces deux informations :
    - si pas de serveur, erreur 10061
    - such as 10061 when the server is not running
    comme si le serveur ne tournait pas...

    Est-ce que tu peux pinger l'adresse utilisée ? Ne serait-ce pas un problème de firewall ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut
    Bon le problème est dans le client parce que qu'on je teste par un site si le port par exemple 6000 est ouvert et mon serveur est en écoute alors le serveur m'indique qu'il y une nouvelle connexion et cette connexion est celle du site qui teste le port et aussi m'informe que le port 6000 est ouvert

  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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par bm1990 Voir le message
    oui les deux sont dans la même machine mais selon mes connaissance ça ne pose aucun problème et je vais te donner un exemple très connu le RAT tu peux exécuter le serveur et le client dans la même machine et tu auras une connexion entre les deux !
    Effectivement, cela ne pose aucun problème (et je l'ai déjà fait)
    Par contre, si tu es sur un réseau interne privé (192.168.x.x par exemple), ton client n'a pas le droit d'utiliser l'adresse IP externe du serveur (celle vue de l'extérieur). Cela s'appelle du NAT Hairpinning. Il te faut utiliser l'adresse IP interne (si tu es sur la même machine, tu peux aussi utiliser 127.0.0.1)
    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
    .

  7. #7
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Effectivement, cela ne pose aucun problème (et je l'ai déjà fait)
    Par contre, si tu es sur un réseau interne privé (192.168.x.x par exemple), ton client n'a pas le droit d'utiliser l'adresse IP externe du serveur (celle vue de l'extérieur). Cela s'appelle du NAT Hairpinning. Il te faut utiliser l'adresse IP interne (si tu es sur la même machine, tu peux aussi utiliser 127.0.0.1)
    Mais mon but est de l'utiliser de l’extérieur ! alors comment corriger le code de client ? que dois je faire ?

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par bm1990 Voir le message
    Bon le problème est dans le client parce que qu'on je teste par un site si le port par exemple 6000 est ouvert et mon serveur est en écoute alors le serveur m'indique qu'il y une nouvelle connexion et cette connexion est celle du site qui teste le port et aussi m'informe que le port 6000 est ouvert
    le client utilise bien l'adresse IP publique du serveur (donc celle de la routeur) ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    le client utilise bien l'adresse IP publique du serveur (donc celle de la routeur) ?
    Oui biensure qu'il utilise celle du routeur et qui est l'adresse publique

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par bm1990 Voir le message
    Oui biensure qu'il utilise celle du routeur et qui est l'adresse publique
    il ne faut pas mettre de côté les questions de bases

    TCP/IP est un protocole très (voir trop) simple, en suivant étape par étape on fini toujours par trouver ce qui cloche.

    que donnent

    "PING adresse_ip"

    et

    "TELNET.EXE adresse_ip port"

    depuis le client ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par bm1990 Voir le message
    Mais mon but est de l'utiliser de l’extérieur ! alors comment corriger le code de client ? que dois je faire ?
    Si tu lis le lien que t'as donné Ram-0000 tu comprendra pourquoi ca ne fonctionne pas.

    Et si tu utilises ton client depuis l'extérieur de ton reseau (ou avec un VPN/proxy externe) tu verra que ça fonctionne.

    Les disfonctionnements que tu décrits correspondent tout à fait au NAT Hairpinning ou NAT Loopback.

    Lance ton client depuis l'extérieur et constate que ça fonctionne...

    Pour faciliter le développement utilise 'localhost' à la place de ton IP public puis pour tes releases remplace localhost par ton IP public ou URL (tout en sachant qu'elle ne fonctionnera pas sur ton réseau local.). Ca peut être une option de ton client : Connexion distante / Connexion locale.

  12. #12
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut
    Le ping par l'invité de commande montre que l'adresse IP publique est joignable et aussi quand je teste si le port est ouvert biensure en connectant avant le serveur alors il montre aussi que le port est ouvert.

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par bm1990 Voir le message
    Le ping par l'invité de commande montre que l'adresse IP publique est joignable et aussi quand je teste si le port est ouvert biensure en connectant avant le serveur alors il montre aussi que le port est ouvert.
    il y a quelque chose que je ne comprend pas dans tout cela.

    en relisant les échanges ci-dessus, en effet tu peux peux pas utiliser l'adresse IP publique sur le réseau local.

    si je prend mon adresse IP publique (celle de ma FreeBox) le ping répond mais si je tente un accès web (la freebox est serveur web) j'obtiens: Page Web inaccessible - ERR_CONNECTION_TIMED_OUT
    de même un "TELNET <adresse IP> 80" m'indique

    C:\Users\Execute>telnet x.y.z.w 80
    Connexion à x.y.z.w...Impossible d'ouvrir une connexion à l'hôte, sur le p
    ort 80: Échec lors de la connexion

    Sur ton client, tu peux utiliser un nom de serveur (j'ai cru comprendre que le serveur est déclaré sur noip) et il te suffit de l'ajouter dans la table host de ton PC
    C:\Windows\System32\drivers\etc\hosts

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # adresse IP -> nom
    127.0.0.1 monserveur.noip.com
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  14. #14
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut
    j'ai tester le client avec mon ami il marche super bien sauf dans la même machine avec serveur il marche pas. Je remercie tous le monde pour leurs réponse.

  15. #15
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut Voila les deux codes que j'ai fini sachant que le deux marchent enfin bien
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
      IdTCPClient, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Edit2: TEdit;
        Button1: TButton;
        Button2: TButton;
        IdTCPClient1: TIdTCPClient;
        Shape1: TShape;
        Memo1: TMemo;
        Timer1: TTimer;
        Label3: TLabel;
        Edit4: TEdit;
        Edit3: TEdit;
        Button3: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Edit3KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    IdTCPClient1.Port:= strtoint(edit2.text);(* spécifier le port*)
    IdTCPClient1.Host:=Edit1.Text; (* Spécifier l'adresse IP du serveur.*)
    if (edit1.Text<>'') and (edit2.Text<>'') and (edit4.Text <>'') then
    begin
    IdTCPClient1.connect; (* demander d’établir une connexion*)
    Shape1.Brush.Color := clblue;(* Brush Spécifie la couleur et le motif utilisés pour remplir le contrôle forme.*)
    button1.Enabled:=false;
    button2.Enabled:=true;
    button3.Enabled:=true;
    edit3.Enabled:=true;
    edit3.SetFocus;
    end;
     
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    IdTCPClient1.Disconnect; (* se déconnecter*)
    Shape1.Brush.Color := clred;
    button1.Enabled:=true;
    button3.Enabled:=false;
    edit3.Enabled:=false;
     
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    IdTCPClient1.WriteLn(edit4.text+': '+edit3.Text); (* envoyer un message de type string à laconnexion courante *)
    memo1.Lines.Append('Moi: '+edit3.Text);
    edit3.Text:='';
    edit3.SetFocus;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
     
        //check for a message from the server
        if idtcpclient1.connected= true then
        if IdTCPClient1.InputBuffer.Size=0 then
        begin
         IdTCPClient1.ReadFromStack(True,0,False);
         while IdTCPClient1.InputBuffer.Size > 0 do
         memo1.Lines.Append(IdTCPClient1.ReadLn+chr(13));
     
    end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    memo1.Clear;
    end;
     
    procedure TForm1.Edit3KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    if (Key=VK_return) then
    begin
    IdTCPClient1.WriteLn(edit4.text+': '+edit3.Text); (* envoyer un message de type string à laconnexion courante *)
    memo1.Lines.Append('Moi: '+edit3.Text);
    edit3.Text:='';
    edit3.SetFocus;
    end;
    end;
     
    end.

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdBaseComponent, IdComponent, IdTCPServer, ExtCtrls, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Label1: TLabel;
        Edit1: TEdit;
        Label2: TLabel;
        Edit2: TEdit;
        Button1: TButton;
        Button2: TButton;
        Shape1: TShape;
        IdTCPServer1: TIdTCPServer;
        Memo1: TMemo;
        Button3: TButton;
        Edit3: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure IdTCPServer1Connect(AThread: TIdPeerThread);
        procedure IdTCPServer1Execute(AThread: TIdPeerThread);
        procedure Button3Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Edit3KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    IdTCPServer1.DefaultPort:= strtoint(edit1.Text);
    IdTCPServer1.Active := true; (*ouvre la une connexion d'écoute qui rend le socketattentif aux demandesdes clients.*)
    edit2.text:= IdTCPServer1.localname;(*localname Indique le nom du système local.*)
    Shape1.Brush.Color := clblue;
    edit3.SetFocus;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    IdTCPServer1.Active := false; (* se déconnecter*)
    Shape1.Brush.Color := clred;
    end;
     
    procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
    begin
    //memo1.Lines.Add ('Connecter de: ' +AThread.Connection.Socket.Binding.PeerIP);
    end;
     
    procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    var text:string;
    begin
    text :=athread.Connection.readln();
    //memo1.Lines.add( athread.Connection.socket.Binding.peerIp+ text);
    memo1.Lines.add(text);
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    var
      Count: Integer;
      List : TList;
    begin
     List := IdTCPServer1.Threads.LockList;
        try
          for Count := 0 to List.Count -1 do
               begin
    //TIdPeerThread(List.Items[Count]).Connection.WriteLn(edit3.text);//write the command to the client
                    TIdPeerThread(List.Items[Count]).Connection.WriteLn(edit2.text+': '+edit3.Text+chr(13));
                end;
     
        finally
            IdTCPServer1.threads.UnlockList;
            memo1.Lines.add('Moi: '+edit3.Text);
            edit3.Text:='';
            edit3.SetFocus;
    end;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    memo1.Clear;
    end;
     
    procedure TForm1.Edit3KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
       var
      Count: Integer;
      List : TList;
    begin
    if (Key=VK_return) then
     begin
     List := IdTCPServer1.Threads.LockList;
        try
          for Count := 0 to List.Count -1 do
               begin
    //TIdPeerThread(List.Items[Count]).Connection.WriteLn(edit3.text);//write the command to the client
                    TIdPeerThread(List.Items[Count]).Connection.WriteLn(edit2.text+': '+edit3.Text+chr(13));
                end;
     
        finally
            IdTCPServer1.threads.UnlockList;
            memo1.Lines.add('Moi: '+edit3.Text);
            edit3.Text:='';
            edit3.SetFocus;
    end;
     
     end;
    end;
     
    end.
    Proposer moi quelque recommandation ou optimisation pour le code et je remercie une autre fois tous le monde.

  16. #16
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    il y a quelque chose que je ne comprend pas dans tout cela.

    en relisant les échanges ci-dessus, en effet tu peux peux pas utiliser l'adresse IP publique sur le réseau local.

    si je prend mon adresse IP publique (celle de ma FreeBox) le ping répond mais si je tente un accès web (la freebox est serveur web) j'obtiens: Page Web inaccessible - ERR_CONNECTION_TIMED_OUT
    de même un "TELNET <adresse IP> 80" m'indique

    C:\Users\Execute>telnet x.y.z.w 80
    Connexion à x.y.z.w...Impossible d'ouvrir une connexion à l'hôte, sur le p
    ort 80: Échec lors de la connexion

    Sur ton client, tu peux utiliser un nom de serveur (j'ai cru comprendre que le serveur est déclaré sur noip) et il te suffit de l'ajouter dans la table host de ton PC
    C:\Windows\System32\drivers\etc\hosts

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # adresse IP -> nom
    127.0.0.1 monserveur.noip.com
    Je vais t'explique ce que j'ai fais:
    1- Je peux accéder à mon router par l'adresse IP publique parce que dans quelques routeurs il faut activer l'access à distance par adresse IP publique
    2- Si ton adresse IP publique est statique alors t'as pas besoin d'utiliser No-IP mais pour si parce que mon adresse est dynamique et puisque elle se change tous l temps alors j'étais obligé d'utiliser No-IP pour la rendre statique pour le client pour que le client trouve toujours le serveur de chat.
    3- Pour rediriger les données reçus par un port depuis l'adresse IP publique vers l'adresse local du serveur de chat il faut utiliser le NAT (Network Adress Translation).

    Merci et je suis sure que tu sais déjà ce que je viens de dire.

  17. #17
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Barbibulle Voir le message
    Si tu lis le lien que t'as donné Ram-0000 tu comprendra pourquoi ca ne fonctionne pas.

    Et si tu utilises ton client depuis l'extérieur de ton reseau (ou avec un VPN/proxy externe) tu verra que ça fonctionne.

    Les disfonctionnements que tu décrits correspondent tout à fait au NAT Hairpinning ou NAT Loopback.

    Lance ton client depuis l'extérieur et constate que ça fonctionne...

    Pour faciliter le développement utilise 'localhost' à la place de ton IP public puis pour tes releases remplace localhost par ton IP public ou URL (tout en sachant qu'elle ne fonctionnera pas sur ton réseau local.). Ca peut être une option de ton client : Connexion distante / Connexion locale.
    Merci Barbibulle il a vraiment fonctionner. mais j'ai pas encore bien compris NAT Hairpinning ou NAT Loopback.

  18. #18
    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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par bm1990 Voir le message
    Merci Barbibulle il a vraiment fonctionner. mais j'ai pas encore bien compris NAT Hairpinning ou NAT Loopback.
    Soit le schéma suivant :
    • Le client sur une machine (192.168.1.1 par exemple)
    • Le serveur sur la même machine (192.168.1.1 cet l'exemple)
    • Le client tente d'ouvrir une connexion vers le serveur en utilisant l'adresse IP externe du serveur (82.8.8.8 dans cet exemple qui est aussi l'adresse IP externe de ta box)


    Suivont maintenant le cheminement théorique du paquet d'ouverture de la session
    1. Il arrive sur l'interface LAN de ta box : IP SRC=192.168.1.1, IP DST=82.8.8.8
    2. routage dans la box de l'interface LAN (ethernet ou WiFi) vers l'interface WAN (ADSL)
    3. Translation d'adresse : IP SRC=82.8.8.8, IP DST=82.8.8.8
    4. Le paquet est prêt à être émis sur l'interface WAN
    5. Ha ? Mais c'est pour moi, y a t'il une règle de NAT entrante ?
    6. Oui, translation inverse IP SRC=192.168.1.1, IP DST=192.168.1.1
    7. Routage du paquet de l'interface WAN vers l'interface LAN
    8. Envoi du paquet sur l'interface LAN
    9. Réception du paquet par le serveur


    Le problème sur les box se situe probablement vers l'étape 7, la box se rend compte qu'un paquet provenant du LAN (intérieur) et à destination du LAN se trouve sur l'interface WAN, cela ressemble fortement à du spoofing IP et c'est pour cela que cela ne passe pas, pour des raisons de sécurité et de protection du réseau.
    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
    .

  19. #19
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Soit le schéma suivant :
    • Le client sur une machine (192.168.1.1 par exemple)
    • Le serveur sur la même machine (192.168.1.1 cet l'exemple)
    • Le client tente d'ouvrir une connexion vers le serveur en utilisant l'adresse IP externe du serveur (82.8.8.8 dans cet exemple qui est aussi l'adresse IP externe de ta box)


    Suivont maintenant le cheminement théorique du paquet d'ouverture de la session
    1. Il arrive sur l'interface LAN de ta box : IP SRC=192.168.1.1, IP DST=82.8.8.8
    2. routage dans la box de l'interface LAN (ethernet ou WiFi) vers l'interface WAN (ADSL)
    3. Translation d'adresse : IP SRC=82.8.8.8, IP DST=82.8.8.8
    4. Le paquet est prêt à être émis sur l'interface WAN
    5. Ha ? Mais c'est pour moi, y a t'il une règle de NAT entrante ?
    6. Oui, translation inverse IP SRC=192.168.1.1, IP DST=192.168.1.1
    7. Routage du paquet de l'interface WAN vers l'interface LAN
    8. Envoi du paquet sur l'interface LAN
    9. Réception du paquet par le serveur


    Le problème sur les box se situe probablement vers l'étape 7, la box se rend compte qu'un paquet provenant du LAN (intérieur) et à destination du LAN se trouve sur l'interface WAN, cela ressemble fortement à du spoofing IP et c'est pour cela que cela ne passe pas, pour des raisons de sécurité et de protection du réseau.
    Merci énormément ram-0000 j'ai bien compris ce que t'as dit. Pour un conseille que ce que tu me proposes comme recommandation ou suggestion sur les deux derniers codes de client et serveur que j'ai poster.

  20. #20
    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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    Heu ... Delphi, c'est pas mon truc
    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
    .

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/09/2013, 00h37
  2. Connexion oracle 10g entre client et serveur
    Par toshiro92 dans le forum Connexions aux bases de données
    Réponses: 2
    Dernier message: 23/02/2010, 14h53
  3. problème lors d'un dialogue entre client et serveur
    Par Dave62 dans le forum Réseau
    Réponses: 3
    Dernier message: 10/12/2008, 09h24
  4. [ODBC] Problème entre client windows, serveur windows
    Par Mascotte dans le forum Installation
    Réponses: 13
    Dernier message: 13/09/2006, 12h15
  5. [Java] Communication entre client et serveur
    Par danje dans le forum CORBA
    Réponses: 1
    Dernier message: 14/12/2004, 18h08

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