O protocolo TCP/IP (Transmission Control Protocol/Internet Protocol) é o protocolo principal utilizado para enviar e receber dados através de Internet. Os comandos Internet de nível baixo de 4D permitem estabelecer sessões TCP para enviar e receber pacotes TCP através destas sessões.
Há dois formas de estabelecer uma conexão TCP. A primeira consiste em executar o comando TCP_Open. Isto abrirá uma conexão com o domínio e porta especificados. TCP_Open permite o uso do protocolo SSL (Secured Socket Layer), que permite uma conexão segura. A segunda forma consiste em utilizar o comando TCP_Listen. Este comando abre uma conexão com o domínio e o porto especificados, e escuta as conexões de entrada. A melhor forma de determinar se uma conexão foi estabelecida é comprovar o estado da sessão com o comando TCP_State ao finalizar o comando TCP_Listen. Um código de estado será devolvido, indicando o estado atual da sessão. Desde aqui pode enviar e/ou receber pacotes TCP como seria feito com uma conexão estabelecida com TCP_Open.
Em todos os casos, toda conexão TCP aberta deve ser fechada posteriormente com ajuda do comando TCP_Close.
Os comandos TCP/IP de nível baixo requerem conhecimentos avançados dos protocolos de comunicação. Os desenvolvedores que utilizam estas rotinas devem ter uma compreensão completa de todo protocolo que tentam implementar. Informação sobre os diferentes números de portos atribuídos a TCP/IP, protocolos de comunicação, requisitos de direção, etc. podem ser encontrados nas RFC.
4D Internet commands permite passar diretamente uma referencia de conexão POP3, IMAP, ou FTP aos comandos TCP de nível e vice versa.
Na verdade, por um lado, os protocolos estão em constante evolução, o que leva a criação de novos comandos; por outra parte, alguns pacotes de software fazem sua própria interpretação dos RFCs, voltando as implementações estandarte inutilizáveis. Usando os comandos de baixo nível TCP, os desenvolvedores podem criar as funções de alto nível que necessitam (em lugar de utilizar funções existentes ou para compensar uma função que não existe).
Isto aumenta significativamente a compatibilidade e as possibilidades de desenvolvimento já que os desenvolvedores podem criar seus próprios comandos de alto nível sem ter que reescrever todos os comandos necessários para o uso de um protocolo.
Neste exemplo, o comando IMAP_Capability é substitui por uma função equivalente desenvolvida utilizando os comandos TCP_IP.
$ErrorNum:=IMAP_Login(vHost;vUserName;vUserPassword;vImap_ID)
If($ErrorNum=0)
C_TEXT(vCapability)
$ErrorNum:=IMAP_Capability(vImap_ID;vCapability)
...
End if
$ErrorNum:=IMAP_Logout(vImap_ID)
- Este método pode ser substituído por:
$ErrorNum:=IMAP_Login(vHost;vUserName;vUserPassword;vImap_ID)
If($ErrorNum =0)
C_TEXT(vCapability)
$ErrorNum:=My_IMAP_Capability(vImap_ID)
...
End if
$ErrorNum:=IMAP_Logout(vImap_ID)
- Este é o código da função My_IMAP_Capability:
C_LONGINT($1;$vErrorNum;$0)
C_TEXT($vSentText;$vReceivedText;vCapability)
C_TEXT($2)
$vImap_Id:=$1
$vCmd_Id:="A001"
$MyvtRequestCmd:="CAPABILITY"
$vSentText;:=$vCmd_Id+""+$MyvtRequestCmd+Character(13)+Character(10)
$vReceivedText:=""
$vErrorNum:=TCP_Send($vImap_Id;$vSentText)
If($vErrorNum=0)
$vErrorNum:=TCP_Receive($vImap_Id;$vReceivedText)
Case of
:($vErrorNum#0)
vCapability:=""
:(Position($vCmd_Id+" OK ";$vReceivedText)#0)
vCapability:=$vReceivedText
:(Position($vCmd_Id+" BAD ";$vReceivedText)#0)
vCapability:=""
$vErrorNum:=10096
End case
End if
$0:=$vErrorNum