Forum und email

fsockopen

(PHP 4, PHP 5)

fsockopen — Internet vagy Unix domain socket megnyitása

Leírás

resource fsockopen ( string $célgép , int $port [, int &$errno [, string &$errstr [, float $timeout ]]] )

Kapcsolatot kezdeményez a célgép felé. A PHP különféle adatátviteli formákat támogat, ezekről bővebben itt: List of Supported Socket Transports. Az aktuális szerveren támpgatott átviteli protokollok listája a stream_get_transports() függvénnyel nyerhető ki.

Note: Amennyiben az socketen keresztüli írás-olvasás időtúllépési idejét szeretnéd beállítani, a stream_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(), fwrite(), 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 stream_set_blocking() segítségével.

Example#1 fsockopen() Példa

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out  = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    
    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ó.

Example#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($fp26);
    
fclose($fp);
}
?>
Warning

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.

Note: Ipv6 címek megadása esetén azokat szögletes zárójelek közé kell tenni. Példával élve: tcp://[fe80::1]:80

Note: 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(), stream_set_blocking(), stream_set_timeout(), fgets(), fgetss(), fwrite(), fclose() és feof()!