fsockopen

(PHP 3, PHP 4 )

fsockopen --  Internet vagy Unix domain socket megnyitása

Leírás

int fsockopen ( string hostname, int port [, int errno [, string errstr [, float timeout]]])

Stream típusú kapcsolatot kezdeményez egy Internet (AF_INET, TCP vagy UDP protokollal) vagy Unix (AF_UNIX) tartomány felé. Internet tartomány megadása esetén TCP kapcsolatot nyit a hostname paraméterben megadott géppel, a port paraméterben megadott porton. Ez esetben a hostname lehet tartománynév vagy IP cím is. UDP kapcsolat esetén explicit meg kell adni a protokollt a hostname paraméterben, a következő módon: udp://hostname. Unix domain esetén a hostname paraméternek kell tartalmaznia a socket elérési útját, ekkor a port értékének nullának kell lennie. A timeout paraméter elhagyható, értéke másodpercekben megadandó. Ez a kapcsolatfelvételkori időtúllépés mértékét szabályozza.

Megjegyzés: Amennyiben az socketen keresztüli írás-olvasás időtúllépési idejét szeretnéd beállítani, a socket_set_timeout() függvény segítségével teheted meg azt. A fsockopen() függvény timeout paraméterével csak a kapcsolatfelvétel időtúllépését tudod szabályozni.

A PHP 4.3.0 verziótól kezdve, ha az OpenSSL támogatást befordítottad a PHP-be, a hostname elé írhatsz 'ssl://' vagy 'tls://' karaktersorozatot is, ha SSL vagy TLS kliens kapcsolatot szeretnél létesíteni a TCP/IP felett a távoli hoszttal.

A fsockopen() függvény egy fájl-azonosítót ad vissza, ami a rendes fájlkezelő parancsokkal együtt használható átlátszó módon. Ezek a következőek: fgets(), fgetss(), fputs(), fclose(), és feof()).

Ha a kapcsolatfelvétel meghiúsul, a visszatérési érték FALSE lesz, és amennyiben az errno és errstr opcionális paraméterek meg lettek adva, ezekben visszakapjuk a connect() rendszerhívás hibaértékét és hibaüzenetét. Amennyiben az errno nulla értékkel jön vissza, miközben a függvény értéke is FALSE, akkor a hiba még valahol a connect() rendszerhívás előtt következett be. Ez általában annak köszönhető, hogy valami probléma merül fel már az inicializáció közben. Az errno és errstr argumentumok referenciaként adják vissza a visszatérési értéket.

Bizonyos rendszereken előfordulhat, hogy a Unix domain illetve a timeout nem használható.

Alapesetben a socket blokkolt módban nyílik meg. Amennyiben ez nem megfelelő, ez átkapcsolható a socket_set_blocking() segítségével.

Példa 1. fsockopen() Példa

$fp = fsockopen ("www.php.net", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br>\n";
} else {
    fputs ($fp, "GET / HTTP/1.0\r\nHost: www.php.net\r\n\r\n");
    while (!feof($fp)) {
        echo fgets ($fp,128);
    }
    fclose ($fp);
}
?>
A következő példa bemutatja, hogy gyűjthető be a saját gépünkön levő "daytime" nevű, 13-as porton figyelő szolgáltatástól információ.

Példa 2. UDP kapcsolat használata

<?php
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {
    echo "Hiba: $errno - $errstr<br>\n";
} else {
    fwrite($fp,"\n");
    echo fread($fp, 26);
    fclose($fp);
}
?>

Figyelem

UDP socketek megnyitásakor bizonyos esetekben nem jön létre hiba, ha a célgép nem elérhető. A hiba ekkor csak az írás/olvasás szakaszában bukkan elő. Ennek az oka az, hogy maga az UDP kapcsolat nem egy hagyományos kapcsolat, ezért az operációs rendszer nem próbál hivatkozást létrehozni egészen addíg, amíg konkrét adattovábbításra nincs szükség.

Megjegyzés: A timeout paraméter a 3.0.9-es verziótól felfele, míg az UDP támogatás csak a 4-es verziókban elérhető.

Lásd még: pfsockopen(), socket_set_blocking(), socket_set_timeout(), fgets(), fgetss(), fputs(), fclose() és feof()!