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: 28716
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-2020 v.1.5 | design: diviXdesign & rainbowcolors