version 2003 (Modifiée)
TCP/IP ou Transmission Control Protocol/Internet Protocol est le principal protocole utilisé pour l'envoi de données sur Internet. Les commandes Internet de bas niveau de 4D permettent d'établir des sessions TCP puis d'envoyer et/ou de recevoir des paquets TCP via ces sessions.
Il existe deux manières d'établir une connexion TCP :
La première consiste à exécuter la commande TCP_Open. Celle-ci ouvre une connexion avec le domaine et sur le port spécifiés. Elle permet de se connecter à un serveur TCP. La commande TCP_Open permet l'utilisation du protocole SSL (Secured Socket Layer) afin de sécuriser la connexion.
La seconde consiste à exécuter la commande TCP_Listen. Celle-ci ouvre une connexion avec le domaine et sur le port spécifiés, et écoute les connexions entrantes. La meilleure façon de déterminer si une connexion a été établie consiste à vérifier l'état de la session avec la commande TCP_State, après l'exécution de TCP_Listen. Un code de statut est alors renvoyé, indiquant l'état courant de la session. A partir de là, vous pouvez envoyer et/ou recevoir des paquets TCP comme vous le feriez lors d'une connexion établie avec TCP_Open.
Dans tous les cas, toute connexion TCP ouverte doit être refermée à l'aide de la commande TCP_Close.
Les commandes TCP/IP de bas niveau nécessitent une connaissance approfondie des protocoles de communication. Pour obtenir des informations complémentaires sur les différents numéros de port affectés à TCP/IP, les protocoles de communication, les impératifs d'adressage, etc., veuillez vous reporter aux RFCs.
Références de connexions dans les commandes TCP
Les commandes Internet de 4D permettent de passer directement une référence de connexion POP3, IMAP ou FTP aux commandes TCP de bas niveau et inversement.
En effet, d'une part les protocoles évoluent régulièrement, donnant naissance à de nouvelles commandes ; d'autre part, certains progiciels font leur propre interprétation des RFCs rendant les implémentations normalisées inutilisables. Avec ce principe, le développeur pourra créer lui-même les fonctions de haut niveau dont il a besoin (à la place de fonctions existantes ou pour palier à l'inexistence d'une fonction) à l'aide des commandes bas niveau TCP.
Cette fonctionnalité accroît significativement l'ouverture et les possibilités de développement puisque les développeurs peuvent créer leurs propres commandes de haut niveau sans devoir réécrire toutes les commandes nécessaires à l'exploitation d'un protocole.
Dans cet exemple, la commande IMAP_Capability est remplacée par une fonction équivalente développée à l'aide des commandes TCP_IP.
Voici la méthode initiale utilisant la commande IMAP_Capability :
$ErrorNum:=IMAP_Login(vHost;vUserName;vUserPassword;vImap_ID) Si($ErrorNum=0) C_TEXTE(vCapability) $ErrorNum:=IMAP_Capability(vImap_ID;vCapability) ... ` Commandes IMAP utilisant le paramètre vImap_ID Fin de si $ErrorNum:=IMAP_Logout(vImap_ID)
Cette méthode peut être remplacée par :
$ErrorNum:=IMAP_Login(vHost;vUserName;vUserPassword;vImap_ID) Si($ErrorNum =0) C_TEXTE(vCapability) ` Méthode TCP utilisant la valeur du paramètre vImap_ID : $ErrorNum:=My_IMAP_Capability(vImap_ID) ... ` Commandes IMAP utilisant le paramètre vImap_ID Fin de si $ErrorNum:=IMAP_Logout(vImap_ID)
Voici le code de la fonction My_IMAP_Capability :
C_ENTIER LONG($1;$vErrorNum;$0) C_TEXTE($vTexteEnvoyé;$vTexteReçu;vCapability) C_TEXTE($2) $vImap_Id:=$1 $vCmd_Id:="A001" ` Cet ID de commande doit être unique (cf. RFC 2060) $MyvtRequestCmd:="CAPABILITY" $vTexteEnvoyé:=$vCmd_Id+""+$MyvtRequestCmd+Caractere(13)+Caractere(10) $vTexteReçu:="" $vErrorNum:=TCP_Send($vImap_Id;$vTexteEnvoyé) Si ($vErrorNum=0) $vErrorNum:=TCP_Receive($vImap_Id;$vTexteReçu) Au cas ou :($vErrorNum#0) `Erreur de réception vCapability:="" :(Position($vCmd_Id+" OK ";$vTexteReçu)#0) ` Exécution de la commande avec succès vCapability:=$vTexteReçu ` Dans cet exemple, nous ne traitons pas la chaîne reçue :(Position($vCmd_Id+" BAD ";$vTexteReçu)#0) ` Echec de l'exécution de la commande (erreur de syntaxe ` ou commande inconnue) vCapability:="" $vErrorNum:=10096 Fin de cas Fin de si $0:=$vErrorNum