IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Utilisation socket débutant


Sujet :

Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut Utilisation socket débutant
    Bonjour,

    Je suis actuellement le tuto de Paul TOTH pour me familiariser avec les sockets en Windev :
    http://lookinside.free.fr/delphi.php?Winsock

    J'ai donc créée mon unité Socket et sur le clic d'un bouton je fais donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button1Click(Sender: TObject);
    var
      so: TSocket;
    begin
    // so := socket(AF_INET, SOCK_DGRAM, IPROTO_UDP); pour un socket UDP
      so := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // pour un socket TCP
      if so = INVALID_SOCKET then
        Exit; // impossible d'allouer le socket !
    end;
    Mais sur ligne en gras ça me met . attendu mais ( trouvée ... d'où cela vient-il ?

    Ensuite je ne comprend pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    so := socket[/B](AF_INET, SOCK_STREAM, IPPROTO_TCP);
    Il faut que je remplace AF_INET par l'adresse IP... je débute je suis désolée pour ces questions je m'en excuse d'avance...

    Merci aussi pour votre aide
    Windows XP
    Delphi 7

    WinDev Mobile 17

  2. #2
    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 445
    Points
    28 445
    Par défaut
    si tu donnes le nom "socket" à ton unité, "socket" désigne ton unité le compilateur attend donc un identifiant déclaré dans cette unité.

    le plus simple est de renommer ton unité, sinon il faut que tu précises que tu veux appeler la fonction "socket" de l'unité Wisnock en indiquant "so := Winsock.socket(..."
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    D'accord merci
    Windows XP
    Delphi 7

    WinDev Mobile 17

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Par contre j'ai un autre problème j'ai fait la suite avec la connexion Google :

    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
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Socket, Winsock;
    
    type
      Tfrm_TestSocket = class(TForm)
        bt_AllocSocket: TButton;
        bt_ConnectTCPGoogle: TButton;
        bt_Quitter: TButton;
        procedure bt_AllocSocketClick(Sender: TObject);
        procedure bt_ConnectTCPGoogleClick(Sender: TObject);
        procedure bt_QuitterClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
    
    var
      frm_TestSocket: Tfrm_TestSocket;
      so: TSocket;
    
    implementation
    
    {$R *.dfm}
    
    procedure Tfrm_TestSocket.bt_AllocSocketClick(Sender: TObject);
    
    begin
    // so := socket(AF_INET, SOCK_DGRAM, IPROTO_UDP); pour un socket UDP
      so := Winsock.Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  // pour un socket TCP
      MessageBox(0,'Allocation socket OK','Allocation socket',MB_OK);
    
      if so = INVALID_SOCKET then
        MessageBox(0,'Allocation socket impossible','Allocation socket',MB_OK);
        Exit; // impossible d'allouer le socket !
    end;
    
    function INetAddr(const Host: string): Integer;
    var
      pHost: PChar;
      HostEnt: PHostEnt;
    begin
      if Host = '' then // juste au cas ou ...
        Result := INADDR_NONE
      else
      begin
        pHost := PChar(Host);
        Result := inet_addr(pHost); // est-ce une adresse au format x.y.z.w ?
        if Result = INADDR_NONE then 
        begin
          HostEnt := gethostbyname(pHost); // est-ce un nom d'hote ? (résolution DNS)
          if HostEnt <> nil then
            Result := Integer(Pointer(HostEnt^.h_addr^)^);
        end;
      end;
    end;
    
    procedure Tfrm_TestSocket.bt_ConnectTCPGoogleClick(Sender: TObject);
    var
      sa: TSockAddr;
    begin
      FillChar(sa, SizeOf(sa), 0);
      sa.sin_family := AF_INET; // connexion IP
      sa.sin_port := htons(80); // sur le port 80
      sa.sin_addr.S_addr := INetAddr('www.google.fr'); // vers www.google.fr
      if sa.sin_addr.S_addr = INADDR_NONE then  // adresse IP non trouvée    MessageBox(0,'Adresse IP non trouvée','Connexion à Google en TCP',MB_OK);
        Exit;
      if connect(so, sa, SizeOf(sa)) = SOCKET_ERROR then  // erreur de connexion
        MessageBox(0,'Erreur Connexion','Connexion  Google en TCP',MB_OK);
        Exit;
    end;
    
    
    
    procedure Tfrm_TestSocket.bt_QuitterClick(Sender: TObject);
    begin
     frm_TestSocket.Close;
    end;
    
    end.
    Et lorsqu'on arrive sur la ligne violette on passe directement à end;
    Comment ça se fait ? Est ce que j'ai fait une erreur ?
    Windows XP
    Delphi 7

    WinDev Mobile 17

  5. #5
    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 445
    Points
    28 445
    Par défaut
    si tu es en Delphi version >= 2009 il faut déclarer des PAnsiChar et des AnsiChar dans INetAddr()

    sinon les Exit en fin de procédure ne servent à rien, et s'ils sont liés au IF il faut encadrer le bloc par un begin/end

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (cond) then
    begin
    end; // fin du IF
     
     
    if (cond) then
      ShowMessage('Hello'); // fin du IF qui ne comprend qu'une instruction !!!
      Exit; // s'execute TOUJOURS
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Delphi 7 pour moi.

    Je suis juste ton code en fait histoire de mieux comprendre le codage socket sous Delphi, mais ça fait 5 ans que je n'ai pas fait de Delphi donc les réflexes et sont dur à retrouver, je m'y remet aujourd'hui.
    Je vais tenter d'arranger les Exit...

    Edit : OK !

    Merci bien

    Petite question pas très maline je sais mais j'en suis pas sûre à quel niveau du code sait-on si la connexion a réussie ? (en gros où puis je mettre mon messagebox connexion ok en fait)

    Actuellement je fais comme ça :

    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
    procedure Tfrm_TestSocket.bt_ConnectTCPGoogleClick(Sender: TObject);
    var
      sa: TSockAddr;
    begin
      FillChar(sa, SizeOf(sa), 0);
      sa.sin_family := AF_INET; // connexion IP
      sa.sin_port := htons(80); // sur le port 80
      sa.sin_addr.S_addr := INetAddr('www.google.fr'); // vers www.google.fr
      if sa.sin_addr.S_addr = INADDR_NONE then  // adresse IP non trouvée
      begin
        MessageBox(0,'Adresse IP non trouvée','Connexion à Google en TCP',MB_OK);
      end;
       // Exit;
      if connect(so, sa, SizeOf(sa)) = SOCKET_ERROR then  // erreur de connexion
      begin
        MessageBox(0,'Erreur Connexion','Connexion  Google en TCP',MB_OK);
      end;
       // Exit;
        MessageBox(0,'Connexion OK','Connexion Google en TCP',MB_OK);
    end;
    Correct ?
    Windows XP
    Delphi 7

    WinDev Mobile 17

  7. #7
    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 445
    Points
    28 445
    Par défaut
    oui mais je mettrais bien les Exit après le message d'erreur histoire de stopper la procédure

    InetAddr fait la résolution d'adresse = transformer un nom en adresse IP via DNS
    connect...ben ça se connecte

    Sinon les différents composants IP ICS, Indy, TCPClient, etc... font exactement la même chose

    mais je trouve ça intéressant de connaitre la programmation des sockets car ça existe partout
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Je suis venue à bout de ton tuto nickel !! Me reste plus qu'à me remettre un peu au Delphi maintenant et à mieux comprendre tout ce code !
    Je te remercie encore
    Windows XP
    Delphi 7

    WinDev Mobile 17

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Une dernière fonction je comprend pas trop la fonction Read String et Fill Cache et pourquoi (si tu as le temps de m'expliquer vite fait hein sinon je me débrouillerai):

    cette fonction retourne la première ligne du cache se terminant par un CR/LF ? parce que la chaine envoyée on l'a terminée par ça c'est ça ? Et du coup on prend le problème à l'envers si on peut dire on part de là et on remonte?
    Windows XP
    Delphi 7

    WinDev Mobile 17

  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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par juju1988 Voir le message
    Une dernière fonction je comprend pas trop la fonction Read String et Fill Cache et pourquoi (si tu as le temps de m'expliquer vite fait hein sinon je me débrouillerai):

    cette fonction retourne la première ligne du cache se terminant par un CR/LF ? parce que la chaine envoyée on l'a terminée par ça c'est ça ? Et du coup on prend le problème à l'envers si on peut dire on part de là et on remonte?
    là tu rentres dans le protocole...il y en a en binaire, d'autres au format texte, ici c'est du HTTP, c'est du format texte et les lignes se termines par un CR/LF

    comme la lecture du socket peut se faire par morceaux (il faut le temps que les données arrivent), tu dois buffeuriser les données jusqu'à ce que tu trouves un CR/LF

    d'où la présence d'un cache qu'on rempli jusqu'à ce qu'il contienne un CR/LF que ReadString renvoie
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    OK compris merciiiiiii
    Windows XP
    Delphi 7

    WinDev Mobile 17

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

Discussions similaires

  1. utilisation socket ssl en perl
    Par psylox dans le forum Développement
    Réponses: 0
    Dernier message: 04/03/2009, 17h21
  2. TOMCAT en PHP - Utiliser sockets en multi-connexions
    Par JB_Lenoir dans le forum Langage
    Réponses: 10
    Dernier message: 23/10/2008, 19h22
  3. navigateur utilisant socket
    Par adivinenza dans le forum Internet
    Réponses: 0
    Dernier message: 18/09/2008, 14h09
  4. [XML Socket] Débutant
    Par too_Slow_ dans le forum Flash
    Réponses: 7
    Dernier message: 11/04/2007, 13h50
  5. Réponses: 6
    Dernier message: 25/08/2006, 20h01

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