Новичку полезно

  • А знаете ли вы что?

    - rudvs - райское наслаждение!


Программирование sockets в PHP

Теги: socket, сокет, php

В данной статье я рассмотрю работу с сокетами на php. Сокеты в php не имеют той силы и той гибкости, которую они имеют в компилируемых языках в среде nix* подобных ОС, но все же их использование иногда нужно для решения некоторых не тривиальных задач. Для решение каких именно задачи и достигая какие цели, могут понадобиться сокеты? Например, если вам нужно реализовать протокол прикладного уровня модели osi.

Что такое sockets?

Сокеты (англ. socket — углубление, гнездо, разъём) - название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет - абстрактный объект, представляющий конечную точку соединения (подробнее…).

Вы можете рассматривать сокет как некий файл, в котором записан адрес человека, которому вы хотите отослать некоторые данные, этого вполне будет достаточно.

Пример программы whois

Рассмотрение работы с сокетами на php я начну с примера реализации небольшой функции whois. Почему именно whois? Потому что это легко, а у меня под рукой есть исходник. Whois - это такая служба, вы даете ей ip адрес, а она вам дает информацию об этом ip адресе, пример работы этого приложения вы можете посмотреть на примере сервиса ip2map. Уже из этих слов вы должны понять, что сокеты это основа клиент серверного программирования, ООП языки http://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование довольно сильно облегчают эту задачу, но понимание базы ни кому еще не мешало. Как пример можно привести CURL в php. CURL действительно облегчат работу программистам, при помощи данной библиотеке можно работать с http, https, ftp, telnet и многими другими протоколами, она с легкостью позволяет авторизироваться на сайте, использовать прокси сервер, отослать или принять cookies и многое другое. Но никогда используя эту библиотеку, вы не поймете http протокол и не узнаете, как все это устроено. Поэтому я считаю, что понимание работы сокетов, клиент-серверного программирования и протоколов является фундаментальной базой для ИТ специалистов, изучать которую нужно обязательно!

Код функции whois

function whois($url, $ip){
  // Соединение с TCP сокетом (например с whois.arin.net) по 43 порту. В результате возвращается дескриптор файла $sock.
  $sock = fsockopen($url, 43, $errno, $errstr);
  if (!$sock) {
 exit("$errno($errstr)");
  } else {
 // Записываем строку ip в сокета.
 fputs ($sock, $ip."\r\n");
 // Осуществляем чтение из сокета.
 $text = "";
 while (!feof($sock)) {
   $text .= fgets ($sock, 128)."
"; } // закрываем соединение fclose ($sock); return $text; } }

Может быть, пример данной функции покажется немного сложным, но посмотрите лучше. Скорей всего здесь для вас всего 4 новые функции, это fsockopen, fputs, fgets, fclose. Все 4 функции работают с одной и той же переменной $sock. Рассмотрим каждую функцию, ее параметры и возвращаемый результат.

$sock = fsockopen($url, 43, $errno, $errstr);

Функция fsockopen нужна для инициализации подключения к сети интернет, результатом ее работы является сокет, но в nix* подобных ОС принято все и вся считать файлом и весь ввод/вывод осуществлять, так же как и работать с файлами, так что это скорей не сокет, а дескриптор файла. Функция fopen кстати тоже может открывать удаленные файлы по протоколам http и ftp. Вы заметили у всех этих функций букву «f» вначале, именно эта буква в начале, говорит нам о том, что эта функция вернет нам файловый дескриптор, а функция предназначена для работы с файлами. Результат работы функции мы помешаем в переменную $sock, с которой и будем дальше работать.

Функция принимает 4 параметра, первый параметр это ip адрес или URL ресурса, интересным фактом для многих окажется то, что работать эта функция может с разными протоколами транспортного уровня, надо просто это указать:

$sock = fsockopen("udp://127.0.0.1", 123, $errno, $errstr);
$sock = fsockopen("tcp://127.0.0.1", 123, $errno, $errstr);

Второй параметр это номер порта для подключения, в нашем случае это 43, если вы хотите работать с http протоколом, то нужно было бы указать порт 80, если с ftp то 21 и т.д.

Третий и четвертый параметры это соответственно номер ошибки и ее краткое описание. Если функция дает сбой за место дескриптора файла она возвращает FALSE. В нашей функции особых проверок на наличие ошибок мы не делаем.

Функции fgets (синоним fread) и fputs (синоним fwrite) соответственно либо читают, либо записывают информацию в сокет.

fputs ($sock, $ip."\r\n");

Функция fputs первым параметром принимает дескриптор файла (нашего сокета) и записывает в него то, что указано вторым параметром. Функция так же прекратит свою работу, если встретит в файле символ конца файла (EOF). В нашей функции, мы записываем в сокет $sock ip адрес, про который хотим получить информацию. Результат получаем с помощью функции fgets.

while (!feof($sock)) {
   $text .= fgets ($sock, 128)."
"; }

Функция fgets считывает данные из сокета, длинна возвращаемой строки определяется вторым параметром. Функция так же прекратит свою работу, если встретит в файле символ конца файла (EOF). В нашей функции мы считываем в цикле по 128 символов из сокета $sock в переменную $text, до тех пор, пока сервер не отправит EOF (пока не будет достигнут конец файла).

При возникновении ошибки обе функции возвращают FALSE.

Функция fclose закрывает дескриптор файла и заканчивает тем самым наше подключение.

В данной статье мы кратко рассмотрели работу с сокетами, но это далеко не все! Рассмотренная нами функция была крайне простой и с сокетами мы работали как с файлами. PHP позволяет нам намного больше, что именно узнаете в следующих статьях…

Добавить комментарий


Обновить


Changan cs55 plus
changan cs55 plus
hermes.changanauto.ru
пакет для хранения шин
paketyar.ru
Красное дерево
Aliexpress. Com китайский магазин / Красное дерево купить. Купите сейчас
woodmart.org