PHP kann Socket-Ports auf Remote- oder lokalen Hosts öffnen. Dieser Artikel ist ein kleines Beispiel für die Verwendung von Socket: Stellen Sie eine Verbindung zu einem Usenet-Newsgroup-Server her, sprechen Sie mit dem Server und laden Sie einige Artikel aus der Newsgroup herunter.
Öffnen Sie einen Socket in PHP
Verwenden Sie fsockopen(), um einen Socket zu öffnen. Diese Funktion kann sowohl in PHP3 als auch in PHP4 verwendet werden. Die Funktionsdeklaration sieht folgendermaßen aus:
int fsockopen (string hostname, int port _
[, int errno [, string errstr [, double timeout]]])
Diese Funktion öffnet eine TCP-Verbindung zum Port des Hosts Hostname. Hostname kann ein gültiger Domänenname oder eine IP-Adresse sein. Für UDP-Verbindungen müssen Sie das Protokoll angeben: udp://hostname. Bei Unix-Domänen verwendet der Hostname den Pfad zum Socket. In diesem Fall muss der Port auf 0 gesetzt werden. Der optionale Timeout-Parameter wird verwendet, um die Zeit in Sekunden festzulegen, die auf das Öffnen eines Sockets gewartet werden soll.
Network News Transfer Protocol
Für den Zugriff auf Newsgroup-Server ist ein Protokoll namens NNTP (Network News Transfer Protocol) erforderlich. In diesem Dokument wird beschrieben, wie Sie eine Verbindung zu einem NNTP-Server herstellen, wie Sie mit dem Server kommunizieren und welche verschiedenen Befehle zum Ausführen dieser Aufgaben erforderlich sind.
Verbinden
Um eine Verbindung zu einem NNTP-Server herzustellen, müssen Sie dessen Hostnamen (oder IP-Adresse) und den Port kennen, den er überwacht. Um zu vermeiden, dass ein fehlgeschlagener Verbindungsversuch dazu führt, dass das Programm hängen bleibt, sollten Sie den Timeout-Parameter verwenden.
$cfgServer = "your.news.host";
$cfgPort = 119;
$cfgTimeOut = 10;
//öffne einen Socket
if(!$cfgTimeOut)
// ohne Timeout
$usenet_handle = fsockopen($cfgServer, $cfgPort);
else
$usenet _handle = fsockopen($cfgServer , $cfgPort, &$ errno, &$errstr, $cfgTimeOut);
echo "Connection failed.n" }
else {
echo "Connected.n";
}
?> Nachdem wir nun eine Verbindung zum Server hergestellt haben, können wir über den zuvor geöffneten Socket mit dem Server kommunizieren. Nehmen wir zum Beispiel an, wir möchten die letzten 10 Artikel einer bestimmten Newsgruppe abrufen. RFC977 weist darauf hin, dass der erste Schritt darin besteht, mit dem Befehl GROUP die richtige Newsgruppe auszuwählen:
GROUP ggg
Der Parameter ggg ist der Name der Newsgruppe, die ausgewählt werden soll (z. B. „net.news“ ), was erforderlich ist. Eine Liste der verfügbaren Newsgroups kann mit dem Befehl LIST abgerufen werden. Wenn der Befehl zum Auswählen einer Newsgruppe erfolgreich ist, werden die Artikelnummern des ersten und letzten Artikels in der Gruppe sowie die Anzahl der Artikel in der Gruppe zurückgegeben.
Hier ist ein Beispiel:
chrome:~$ telnet my.news.host 119
Versuche aa.bb.cc.dd...
Verbunden mit my.news .host.
Escape-Zeichen ist '^]'
200 my.news.host InterNetNews NNRP-Server INN 2.2.2 13. Dezember 1999 bereit (Veröffentlichung ok). 🎜> quit
Nach dem Empfang des Befehls GROUP alt.test gibt der Server „211 232 222996 223235 alt.test“ zurück. 211 ist im RFC definiert und zeigt an, dass der Befehl ausgeführt wurde erfolgreich. Aus den Retoureninformationen geht außerdem hervor, dass es mittlerweile 232 Artikel gibt, die früheste Artikelnummer ist 222996 und die neueste Artikelnummer ist 223235. Wir sehen, dass 222996+232 nicht gleich 223235 ist. Die fehlenden 7 Artikel wurden aus irgendeinem Grund vom Server gelöscht, entweder weil sie von ihren legitimen Autoren gelöscht wurden (was möglich und einfach ist) oder weil es sich um Spam-Artikel handelte.
Beachten Sie, dass einige Server vor der Auswahl einer Newsgruppe möglicherweise eine Authentifizierung erfordern, je nachdem, ob es sich um einen öffentlichen oder privaten Server handelt. Es ist auch möglich, dass der Server jedem erlaubt, den Artikel zu lesen, die Veröffentlichung des Artikels jedoch eine Authentifizierung erfordert.
//$cfgUser = "xxxxxx";
//$cfgPasswd = "yyyyyy";
$cfgNewsGroup = "alt.php";
// Identifikation auf privatem Server erforderlich
if($cfgUser) {
fputs($usenet_handle, "AUTHINFO USER ".$cfgUser. "N");
$tmp = fgets($usenet_handle, 1024);
fputs($usenet_handle, "AUTHINFO PASS ".$cfgPasswd."n"); 02 Authentifizierungsfehler ";
exit();
}
//newsgroup auswählen
fput($usenet_handle, "GROUP ".$cfgNewsGroup."n");
$tmp = fgets($usenet_handle, 1024);
if($tmp == "480 Authentifizierung erforderlich für commandrn") {
echo $tmp;
exit();
}
$info = split(" ", $tmp);
$first= $info[2];
$last = $info[3];
printf("First : %sn", $first);
printf("Last : %lastn", $last);
?>