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

4D Discussion :

4D Internet Commands en mode Asynchrone


Sujet :

4D

  1. #1
    Membre régulier Avatar de Patrice.H
    Homme Profil pro
    Étudiant en alternance
    Inscrit en
    Février 2010
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant en alternance

    Informations forums :
    Inscription : Février 2010
    Messages : 82
    Points : 111
    Points
    111
    Par défaut 4D Internet Commands en mode Asynchrone
    Bonjour,

    je cherche à centraliser certaines informations depuis un client 4D sur un serveur. Pour cela j'utilise un serveur web PHP/MySQL. Pour des raisons de sécurité je souhaiterais passer par le PHP à l'aide de requête POST/GET envoyées depuis mon client 4D. J'ai cru comprendre que le plugin 4D Internet Commands permettait d'envoyer ce genre de requêtes autant que d'en recevoir les réponses.

    En l'absence de documentation exhaustive j'ai donc essayé le code suivant:
    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
    $machine:=Nom de la machine
    $addr:="http://ip.de.mon.serveur/4D-test/4D.php"
    $port:=80
    $param:=""
    TRACE
    C_TEXTE(réponse)
     
    $id_cnx:=TCP_Open ($addr;$port;1)
     
    $erreur:=TCP_Send ($id_cnx;$param)
     
    $erreur:=TCP_Receive ($id_cnx;réponse)
     
     
    $erreur:=TCP_Close ($id_cnx)
     
    ALERTE(réponse)
    Le fichier 4D.php sur le serveur contient un simple "echo 'ça marche';"

    La variable $id_cnx semble se valoriser correctement mais $erreur prend systématiquement la valeur -10004. J'ai l'impression de mal m'y prendre, merci de me réorienter vers le droit chemin.

    Cordialement,
    PH.
    "Il n'y a que deux façons d'avoir le dernier mot avec une femme. Le problème, c'est qu'aucune ne marche."
    Samuel Clemens

  2. #2
    Membre confirmé Avatar de ZeFiF
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2008
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 303
    Points : 486
    Points
    486
    Par défaut
    Bonjour,

    si t'es en v12 tu peux exécuter du php directement et donc faire un curl.
    sinon
    si c'est juste un get que tu veux faire utilise la commande "ouvrir url web"
    si c'est un post c'est plus galère car il faut encoder ce que tu vas envoyer.

    En tout cas, ton code nécessite d'être structuré différemment.
    tcp/ip c'est de l'asynchrone donc tu ne peux jamais être sur que ce que tu as envoyé a été reçu et inversement...

    Donc faut boucler pour s'assurer d'avoir tout reçu,
    ça donne un code dans ce genre là :

    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
     
    C_ENTIER LONG($0) `…numero d'erreur
    C_TEXTE($1) `…IP Addresse
    C_ENTIER($2) `…Port
    C_TEXTE($3) `…HTTP Request
    C_POINTEUR($4) `…pointeur sur la variable resultat
    C_ALPHA(2;$CRLF)
    C_ALPHA(255;$Request)
    C_ENTIER LONG($State;$Err)
    $CRLF:=Caractere(13)+Caractere(10)
     
    $Request:="GET http://"+$1+$3+" HTTP/1.0"+$CRLF+$CRLF
     
    C_TEXTE($TmpBuffer)
    $TmpBuffer:=""
     
    $4->:=""` on efface la variable avant
    $State:=0
    $Err:=TCP_Open ($1;$2;$TCP_ID)
    Si ($Err=0)
    	$Err:=TCP_Send ($TCP_ID;$Request)
    	Si ($Err=0)
    		$vh_start:=Heure courante(*)
    		Repeter 
    			$Err:=TCP_Receive ($TCP_ID;$TmpBuffer)
    			$Err:=$Err+TCP_State ($TCP_ID;$State)
    			$4->:=$4->+$TmpBuffer
    			APPELER 4D
    		Jusque (($State#8) | ($Err#0) | ((Heure courante(*)-$vh_start)>†00:00:30))
    	Fin de si 
    Fin de si 
    $Err:=TCP_Close ($TCP_ID)
    $0:=$Err

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 106
    Points : 133
    Points
    133
    Par défaut
    Ton code comporte une erreur : TCP_Open retourne dans son troisième paramètre l'identifiant de la connexion et retourne un code d'erreur.
    $id_cnx:=TCP_Open ($addr;$port;1)
    Ce code "attribue" à 1 l'id de connexion...

    La bonne syntaxe est :
    $erreur:=TCP_Open ($addr;$port;$id_cnx;1)

    Toute la doc se trouve

  4. #4
    Membre régulier Avatar de Patrice.H
    Homme Profil pro
    Étudiant en alternance
    Inscrit en
    Février 2010
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant en alternance

    Informations forums :
    Inscription : Février 2010
    Messages : 82
    Points : 111
    Points
    111
    Par défaut
    runciter> Merci, j'avais lu la doc en diagonale par manque de temps.

    ZeFiF> Merci pour le snippet. Cependant je n'ai pas compris le but de la variable $3. Peux-tu m'envoyer un exemple d'appel de cette fonction?

    EDIT: J'ai réussi à la faire marcher. Mais j'ai d'autres questions: Charge à moi de séparer le header de la réponse HTTP du corps du message ou il y a une fonction?
    Connais tu une façon similaire d'effectuer des requêtes POST? (J'avoue ne pas avoir encore cherché dans les normes des requêtes POST)

    Cordialement,
    PH.
    "Il n'y a que deux façons d'avoir le dernier mot avec une femme. Le problème, c'est qu'aucune ne marche."
    Samuel Clemens

Discussions similaires

  1. Lancer une commande de manière asynchrone
    Par CestLudique dans le forum Administration système
    Réponses: 2
    Dernier message: 20/06/2007, 13h41
  2. [Free Pascal] Comment passer des commande en mode MS-DOS
    Par JoseF dans le forum Free Pascal
    Réponses: 7
    Dernier message: 13/03/2007, 19h37
  3. Réponses: 2
    Dernier message: 05/01/2007, 16h57
  4. Réponses: 9
    Dernier message: 27/10/2005, 17h44
  5. [.NET] Une question technique a propos du mode asynchrone
    Par nicknolt dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 08/06/2004, 10h07

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