Loading:


    socket_create

    resource socket_create ( int $domain , int $type , int $protocol )

    Tworzy gniazdo (punkt końcowy dla komunikacji


    Parametry



    domain- parametr określa z jakiej rodziny jest protokół użyty przez gniazdo


    możliwe rodziny adresu/ptotokołu
    Domena opis
    AF_INET IPv4 oparty o protokoły internetowe. TCP i UDP są protokołami wspólnymi w tej rodzieni protokołów.
    AF_INET6 IPv6  oparty o protokoły internetowe. TCP i UDP są protokołami wspólnymi w tej rodzieni protokołów. Dla PHP 5.0.0.
    AF_UNIX Lokalny protokuł kominikacyjny rodziny. Wysoka wydajność i niski koszt sprawia że jest najlepszy z IPC  (Komunikacja międzyprocesowa).




    type - ten parametr określa typ komunikacji użytej przez gniazdo



    Możliwe typy gniazda
    Typ Opis
    SOCK_STREAM Zapewnia kolejność, niezawodność, strumieniowego połączenia.
    Poza zespołem mechanizmu trnsmisji danyc może być wsparty.
    Protokuł TPC jest oparty na tym typie gniazda
    SOCK_DGRAM Obsługuje datagramy (bez połączenia, niewiarygodne wiadomości o określonej maksymalnej długości). Protkuł UDP jest oparty na gnieździe tego typu.
    SOCK_SEQPACKET Zapewnia kolejność, niezawodność, dwudrożne połączenie oparte o ścieżkę transmisji danyc dla datagramów o określonej maksymalnej długości
    SOCK_RAW Dostarcza surowy protokuł dostępu sieci. Ten specjalny typ gniazda moze być użyty ręcznie w każdym typie protokołu.
    Często używany dla tego typu gniazda aby wykonaćżądanie ICMP  (takie jeak ping, traceroute, itd).
    SOCK_RDM Dostarcza niezawodne datagramy, które nie gwarantują kolejności. Jest to najprawdopodobniej nie zaimplementowane w woim systemie




    protocol - Ten parametr ustawia określony protokuł wewnątrz określonej domeny użytej do komunikacji na zwróconym gnieździe.Prawidłowe wartości mogą być pobierane a pomocą nazwy użytej przez getprotobyname(). Jeśli pożądanym protokołem jest TPC, lub UPD odpowiednie stałe SOL_TCP i SOL_UDP mogą być również wykorzystywane.


    Częste protokoły
    Nazwa Opis
    icmp Internetowy kontroler wiadomości protokołu 
    jest używany głównie przez bramy i hostów datagramów raport błędów w komunikacji. Komenda "ping" jest przykładem aplikacji ICMP
    udp Datagramy protokołu użytkownika są używane bezpołączeniowo. Protokół ze stałą długością rekordów.  
    Ze względu na te aspekty, UDP wymaga minimalnej kwotyniepowtarzalnego protokołu.
    tcp Protokół kontroli transmisji jest wiarygodny, oparty o połączenie, zorientowany strumieniowo.
    TCP gwarantuje, że wszystkie pakiety zostaną odebrane w takiej kolejności, w jakiej zostały wysłane. Jeśli jakiś pakiet zostanie utracony podczas komunikacji, TPC automatycznie retransmituje pakiet dopuki docelowy host nie przyzna pakietu. Dla wiarygodności i wydajności TPC podczas realizacji sam decyduje o odpowiednich granicach warstwy komunikacyjnej datagramu
    Zatem TPC musi dopuczszać możliwość częściowej transmisji




    Zwracane wartości

    socket_create() zwraca zasób gniazda na succes lub FALSE



    Napisz Artyku³

    Listing


    <?php

    /// start ping.inc.php ///

    $g_icmp_error = "No Error";

    // timeout in ms
    function ping($host, $timeout)
    {
            $port = 0;
            $datasize = 64;
            global $g_icmp_error;
            $g_icmp_error = "No Error";
            $ident = array(ord('J'), ord('C'));
            $seq   = array(rand(0, 255), rand(0, 255));

         $packet = '';
         $packet .= chr(8); // type = 8 : request
         $packet .= chr(0); // code = 0

         $packet .= chr(0); // checksum init
         $packet .= chr(0); // checksum init

            $packet .= chr($ident[0]); // identifier
            $packet .= chr($ident[1]); // identifier

            $packet .= chr($seq[0]); // seq
            $packet .= chr($seq[1]); // seq

            for ($i = 0; $i < $datasize; $i++)
                    $packet .= chr(0);

            $chk = icmpChecksum($packet);

            $packet[2] = $chk[0]; // checksum init
            $packet[3] = $chk[1]; // checksum init

            $sock = socket_create(AF_INET, SOCK_RAW,  getprotobyname('icmp'));
            $time_start = microtime();
        socket_sendto($sock, $packet, strlen($packet), 0, $host, $port);
       

        $read   = array($sock);
            $write  = NULL;
            $except = NULL;

            $select = socket_select($read, $write, $except, 0, $timeout * 1000);
            if ($select === NULL)
            {
                    $g_icmp_error = "Zaznacz Error";
                    socket_close($sock);
                    return -1;
            }
            elseif ($select === 0)
            {
                    $g_icmp_error = "Przekroczony czas";
                    socket_close($sock);
                    return -1;
            }

        $recv = '';
        $time_stop = microtime();
        socket_recvfrom($sock, $recv, 65535, 0, $host, $port);
            $recv = unpack('C*', $recv);
           
            if ($recv[10] !== 1) // ICMP proto = 1
            {
                    $g_icmp_error = "nie ma pakietu ICMP";
                    socket_close($sock);
                    return -1;
            }

            if ($recv[21] !== 0) // ICMP odpowiedz = 0
            {
                    $g_icmp_error = "Not ICMP response";
                    socket_close($sock);
                    return -1;
            }

            if ($ident[0] !== $recv[25] || $ident[1] !== $recv[26])
            {
                    $g_icmp_error = "Zły numer identyfikacyjny";
                    socket_close($sock);
                    return -1;
            }
           
            if ($seq[0] !== $recv[27] || $seq[1] !== $recv[28])
            {
                    $g_icmp_error = "Zły numer";
                    socket_close($sock);
                    return -1;
            }

            $ms = ($time_stop - $time_start) * 1000;
           
            if ($ms < 0)
            {
                    $g_icmp_error = "Odpowiedz zbyt długa";
                    $ms = -1;
            }

            socket_close($sock);

            return $ms;
    }

    function icmpChecksum($data)
    {
            $bit = unpack('n*', $data);
            $sum = array_sum($bit);

            if (strlen($data) % 2) {
                    $temp = unpack('C*', $data[strlen($data) - 1]);
                    $sum += $temp[1];
            }

            $sum = ($sum >> 16) + ($sum & 0xffff);
            $sum += ($sum >> 16);

            return pack('n*', ~$sum);
    }

    function getLastIcmpError()
    {
            global $g_icmp_error;
            return $g_icmp_error;
    }
    /// end ping.inc.php ///
    ?>




    Dodano przez: igor
    Ranga: Administrator serwisu Punktów: 0
    Komentarze użytkowników
      • Tre¶æ komentarza
        Kod do komentarza (opcjonalnie)
        PHP JavaScript MySQL Smarty SQL HTML CSS ActionScript
        Autor
        Token
        token

         

         








    funkcje.net
    Wszelkie prawa zastrzeżone©. | Funkcje.net 2008-2025 v.1.5 | design: diviXdesign & rainbowcolors