I Socket
Nella parte quinta abbiamo visto come inviare una Mail attraverso una funzione,
che a sua volta utilizzava proprio i socket.
Brevemente diremo che i socket sono una interfaccia di comunicazione UNIX
per consentire la comunicazione tra processi ed applicazioni attraverso la
rete, cosa che permette di colloquiare con un processo funzionante su un'altra
macchina servendosi di un protocollo di rete come il TCP/IP. L'applicazione
apre un "socket" (innesto) e dichiara l'indirzzo
di destinazione, di seguito la rete si occupa di creare la connessione.
Infatti si può benissimo inviare una mail utilizzando direttamente
i socket, infatti che cosa è una mail se non una serie di dati da inviare
alla porta 25 (Simple Mail Transfer) ?
Per il resto bisogna scriverci dentro (fputs)
tutto, incluso le intestazioni, rispettando lo standard per le SMTP (rfc1090,
rfc974, rfc822, rfc821 scaricati dal sito AlterNIC
e in allegato) ed attendere la risposta (fputs).
Ci sono una quarantina di funzioni, ma la princiaple, quella che permette
di aprire la connessione, è
int fsockopen (string [udp://]hostname,
int port [, int errno
[, string errstr [, float timeout]]])
Gli argomenti sono semplici da comprendere:
L'hostname (mbox.docenti.org p.e.), la
porta (25 per l'SMTP), l'errore restituito
sottoforma numerica e descrittiva se la connessione non ha avuto successo,
il tempo d'attesa per la chiamata al sistema.
La funzione restituisce un int di valore booleano (TRUE/FALSE, nr/0),
che permette di sapere se la connessione ha avuto successo.
Poi inviare le richieste al server web con
int fputs (int fp,
string str, int [length])
e attendere la risposta con
string fgets (int fp,
int length)
fp è il numero della connessione (file
puntato), str la stringa che viene inviata e
length la grandezza del buffer
infine si deve chiudere la connessione con
bool fclose (int fp)
il programmino sockmail.php:
<?php
// impostazione variabili
// il mail server e il tempo d'attesa
// a 30 secondi
$strMailServer = "mbox.docenti.org";
$flTempodAttesa = 30;
$strMyTemp = "";
// connessione
// nome host, porta, errore numero, errore descrizione, timeout
$intMyConn = fsockopen($strMailServer,
25, $intErr,
$strErr, $flTempodAttesa);
// verifica connessione TRUE/FALSE
if ($intMyConn)
{
// connessione avvenuta
fputs ($intMyConn, "HELO
host\n");
fgets ($intMyConn, 128); //
colloca risposta nel buffer
fputs ($intMyConn, "MAIL
FROM: <info@docenti.org>\n");
fgets ($intMyConn, 128); //
colloca risposta nel buffer
fputs ($intMyConn, "RCPT
TO: <fm@docenti.org>\n");
fgets ($intMyConn, 128); //
colloca risposta nel buffer
fputs ($intMyConn, "DATA\n");
$strMyTemp = fgets ($intMyConn, 128); // colloca risposta
nel buffer
fputs ($intMyConn, "Subject:
socket mail!\n");
fputs ($intMyConn, "inviata
dal web.\n");
fputs ($intMyConn, "\n");
fputs ($intMyConn, "Bye\n");
fputs ($intMyConn, ".\n");
fputs ($intMyConn, "QUIT\n");
// termine connesisone
fclose ($intMyConn);
}
else
{
// errore
echo "Connessione al server $strMailServer
fallita <br>\n";
echo "Errore nr $intErr - descr. $strErr <br>\n";
}
?>
|
Rispetto ad ASP è una operazione visibilente più complessa,
dato che PHP utilizza i socket e per forza di cose bisogna scrivere, dopo
aver aperto la connessione, tutti i valori da inviare. In ASP è un
oggetto CDONTS, preconfezionato ed estremamente semplice.
Chi naturamente volesse utilizzare oggeti preconfezionati in PHP può
far uso di PHPNuke (http://www.phpnuke.org/),
che offre svariate soluzioni per il WEB programmabili con pochissime istruzioni:
forum, chat, mail, impaginatori, carreli spese, ecc
Indubbiamente PHp offre soluzioni molto potenti, ma scarseggia fortemente,
di oggetti che devono essere costruiti a mano.
Altresì si possono richiedere anche infomazioni sul proprio server,
utilizzando tutte le porte disponibili (svrinfo.php):
<?php
$strHostName = "localhost";
function GetMyWebServices($strHostName, $strService, $intPort)
{
$intMyConn = fsockopen($strHostName, $intPort);
if ($intMyConn)
{echo "Servizio: <i>$strService su porta $intPort</i>
<b>attivo</b><br>\n";
fclose ($intMyConn);
}
else
{echo "Servizio: <i>$strService su porta $intPort</i>
non attivo<br>\n"; }
}
echo "Host Name: <i>$strHostName</i><br>\n";
$strMyConn = GetMyWebServices($strHostName, "http",
80);
$strMyConn = GetMyWebServices($strHostName, "ftp",
21);
$strMyConn = GetMyWebServices($strHostName, "smtp",
25);
$strMyConn = GetMyWebServices($strHostName, "pop3",
110);
$strMyConn = GetMyWebServices($strHostName, "ssh",
22);
$strMyConn = GetMyWebServices($strHostName, "mysql",
3306);
$strMyConn = GetMyWebServices($strHostName, "news",
119);
?>
|
L'esempio si commenta da sè, come anche il risultato del mio server
Termina la parte generale, dove sono stati affrontati tutti gli argomenti
più importanti utili per poter affrontare circa il 90% di soluzioni
per il web. Seguiranno poco alla volta quelli particolari e più approfonditi.
Buon lavoro !
Scarica gli esempi allegati
Attenzione: gli esempi qui mostrati funzionano con copia e incolla
a patto che vengano tolti tutti i caratteri superflui (colore, spaziatura,
...) utili per una migliore visualizzazione sui browser, ma fastidiosi per
il parser PHP!
Pagina precedente -
Pagina successiva
|