COMPROBAR SI UNA DIRECCIÓN DE CORREO ES VÁLIDA
Debemos añadir la unidad mailchck en el formulario donde vamos a realizar la comprobación y llamamos a esta función:
function mailcheck(email: string): integer;
Y estos son los valores que devuelve:
0 - La dirección existe
1 - La dirección puede existir
2 - Tus direcciones DNS no son válidas
3 - Tus direcciones DNS no están definidas
4 - No puede conectar con los servidores MX
5 - El dominio no tiene registro MX
6 - La dirección no existe
7 - La dirección es incorrecta
ESCANEAR DIRECCIONES IP
Vamos a crear un pequeño programa que recorra un rango de direcciones IP y nos diga si existen o no. Es como si hiciésemos un Ping a cada dirección. Para ello creamos un nuevo proyecto con este formulario:

Para no reinventar la rueda, vamos a copiar las unidades IPUtils.pas y IPThread.pas de la carpeta:
\CodeGear\RAD Studio\5.0\Componentes\Synapse\source\demo\scan
a la carpeta donde tenemos este proyecto y las vinculamos a nuestro formulario:
uses
..., IPUtils, PingThread;
Y este sería el código para recorrer todas las direcciones:
procedure TFEscanear.BEscanearClick(Sender: TObject);
var
i, j: Cardinal;
Ping: Array of TPingResult;
ContadorPing, DirInicial, DirFinal: Cardinal;
Puffer: String;
Hilos: Array of TPingThread;
bHilosCompletados: Boolean;
begin
// Pasamos las direcciones IP de texto a entero
DirInicial := IPToCardinal(StrToIP(DirIni.Text));
DirFinal := IPToCardinal(StrToIP(DirFin.Text));
// Contamos el nº de direcciones a escanear
ContadorPing := (DirFinal - DirInicial) + 1;
// Mostramos el nº de direcciones a escanear
Lista.Items.Add('Escaneando ' + IntToStr(ContadorPing) + ' direcciones...');
Application.ProcessMessages;
// Inicializamos el array dinámico
SetLength(Ping, ContadorPing);
SetLength(Hilos, ContadorPing);
// Recorremos las direcciones y las metemos en el array
j := 0;
for i := DirInicial to DirFinal do
begin
Ping[j].IPAdress := IPToStr(CardinalToIP(i));
Ping[j].Exists := False;
Inc(j);
end;
// Creamos un hilo para cada Ping
for i := 0 to ContadorPing - 1 do
Hilos[i] := TPingThread.Create(Ping[i]);
Lista.Items.Add(' ');
// Esperamos a que los hilos sean ejecutados
repeat
bHilosCompletados := True;
Sleep(1000);
for i := 0 to ContadorPing - 1 do
begin
if not Hilos[i].Ready then
begin
bHilosCompletados := False;
Break;
end;
end;
until bHilosCompletados;
// Volcamos los resultados a la lista
for i := 0 to ContadorPing - 1 do
begin
if Hilos[i].PingResult.Exists then
begin
Puffer := IntToStr(i + 1) + ' ' + Hilos[i].PingResult.IPAdress;
Lista.Items.Add(Puffer);
end;
end;
// Liberamos los hilos de ejecución
for i := 0 to ContadorPing - 1 do
Hilos[i].Free;
end;
Lo que hace es lanzar un hilo de ejecución por cada dirección y cuando terminen todos los muestra por pantalla. Ejecutamos el programa, pulsamos el botón Escanear y esperamos a que termine:

SINCRONIZAR LA HORA DE VARIOS ORDENADORES
El protocolo NTP (Network Time Procotol) se creó para sincronizar los relojes de cada PC a través de redes, algo ideal para sistemas con bases de datos distribuidas.
Vamos a crear un pequeño programa que lea la hora de un servidor SNTP o NTP:

procedure TFClienteSNTP.BLeerClick(Sender: TObject);
var
SNTP: TSntpSend;
begin
SNTP := TSntpSend.Create;
try
SNTP.TargetHost := URL.Text;
if SNTP.GetSNTP then
EMensaje.Caption :=
DatetimeToStr(SNTP.NTPTime) + ' UTC'
else
EMensaje.Caption := 'No conectado.';
finally
SNTP.Free;
end;
end;
Para poder utilizar la clase TSntpSend necesitamos añadir la unidad SNTPsend al formulario. Al ejecutar el programa, podemos probarlo con nosotros mismos ya que Windows incorpora un servidor SNTP:


http://www.pool.ntp.org/zone/europe

Como funciona sobre UDP, es muy rápido y puede ser de mucha utilidad para que comiencen a la vez las copias de seguridad de distintos centros o para realizar una comunicación directa por TCP a una cierta hora del día.
ENVIAR DATOS POR EL PUERTO SERIE
El ejemplo que trae Synapse sobre las comunicación por el puerto serie no funciona, ya que han cambiado los parámetros de la función Connect y los han desviado a la función Config. Para hacer una prueba hice este formulario:

procedure TFPuetoSerie.BEnviarClick(Sender: TObject);
var
Serie: TBlockSerial;
begin
Serie := TBlockSerial.Create;
Serie.RaiseExcept := True;
try
Serie.Config(StrToIntDef(Baudios.Text, 9600), 8, 'N', 0, False, False);
Serie.Connect(Puerto.Text);
Salida.Lines.Text := Serie.ATCommand(Comando.Text);
finally
Serie.Free;
end;
end;
También debemos añadir la unidad SynaSer al mismo. Por más que lo he intentado siempre me salta esta excepción:


CONCLUSIONES
A parte de todo lo que hemos visto, esta librería incorpora otros ejemplos como un servidor de ECHO o rutinas para codificar en MIME, algo utilizado para enviar datos por correo a pelo, pero creo que en ese sentido los componentes Indy le superan.
Por lo demás, solo queda decir que aunque no es una librería demasiado extensa, si funciona muy bien, es rápida y permite aprender como se programan algunos protocolos TCP/IP a bajo nivel, algo que puede gustarle a los programadores de troyanos y virus por su bajo consumo de recursos.
Pruebas realizadas en RAD Studio 2007.
7 comentarios:
¿y ya termino?
Esperaba algo más sobre el envió y recepción de correos. Peor en fin, gracias por tus aportes.
No me interesa abarcar mas en esta librería porque todo hay que hacerlo a mano. Es demasiado cruda.
Busco alternativas a las librerías Indy pero con un nivel donde el programador no tenga que estar lanzando hilos de ejecución como un loco.
Y la demo que da Synapse con los ejemplos tampoco son para tirar cohetes.
Saludos.
Gracias por todos tus aportes que siempre son importantes. Gracias ademas por incluir algo del puerto serial.
Muy útiles tus artículos. Siempre que puedo me paso por aquí para ver tus nuevas aportaciones.
Jordi.
ThundaxSoftware
Hola.
Es muy interesante, gracias por compartir estos temas.
Quisiera sugerirte que uses el término correcto y adecuado que es "biblioteca", ya que "librería" es lo que suele llamarse un "falso amigo":
http://es.wikipedia.org/wiki/Anexo:Falsos_amigos#Ingl.C3.A9s
Respetuosamente,
Al González.
Pues fíjate tu que llevo toda la vida llamándolo librerías cuando son bibliotecas.
Cuando más lenguajes de programación aprendemos, más analfabetos nos volvemos de nuestra propia lengua, jeje.
Gracias por la aclaración.
Hola tu pagina esta buena, pero una consulta, aque te refieres con:
Las unidades IPUtils.pas y IPThread.pas de la carpeta:
\CodeGear\RAD Studio\5.0\Componentes\Synapse\source\demo\scan
No corre por que no entiendo esa parte. Gracias
Publicar un comentario