Справка веб-мастера     Справочник web-мастера и программиста
  PHP       Интернет       Беб-дизайн       Безопасность       Javascript     Информеры     Game      
          Игра шарики



Сетевые функции в PHP. Работа с сокетами

Функция fsockopen()

Функцию fopen() можно использовать и для открытия сетевых соединений с файлами на других хостах в Сети. Но функция fopen() позволяла работать только с содержимым файла, переданного по протоколу HTTP.

По HTTP, кроме "тела" документа, передаются заголовки, посланные сервером. Функция fsockopen() позволяет "Добраться" и до заголовков, иногда это бывает полезно.

int fsockopen(string $host, int $port [,int &$errno] [,string &$errstr])

Эта функция работает аналогично fopen(), но только устанавливает сетевое соединение с указанным хостом $host и программой, закрепленной на нем за портом $port. Она возвращает файловый дескриптор, с которым затем могут быть выполнены обычные операции: fread(), fwrite(), fgets(), feof(). В случае ошибки возвращается false и, если заданы параметры-переменные $errno и $errstr, то в них записываются соответственно номер ошибки (не равный нулю) и текст сообщения об ошибке.

Если функция вернула false, но $errno тем не менее сбросилась в 0, это скорее всего означает, что произошла ошибка инициализации сокета. Например, такое может произойти, если в Windows не установлен требуемый протокол TCP/IP.

По умолчанию сокет (соединение) открывается в режиме чтения и записи, используя блокирующий режим передачи. Вы можете переключить режим в неблокирующий, если вызовете функцию socket_set_blocking() (см. ниже заголовок: Функция socket_set_blocking).

В примере из листинга 1 был "проэмулирован" браузер, послав в порт 80 удаленного хоста HTTP-запрос GET и получен весь ответ вместе с заголовками. Мы используем функцию HtmlSpecialChars(), чтобы вывести HTML-код документа в текстовом формате.

Листинг 1. "Эмуляция" браузера

<?
// Соединяемся с Web-сервером soft.net
$fp = fsockopen("soft.net", 80);
// Посылаем запрос главной страницы сервера
fputs($fp,"GET / HTTP/1.0\n\n");
// Читаем по одной строке и выводим ответ
echo "<pre>";
while(!feof($fp))
echo HtmlSpecialChars(fgets($fp,1000));
echo "</pre>";
// Отключаемся от сервера
fclose($fp);
?>

Мы можем использовать не только 80-й порт. Функция fsockopen() универсальна, и позволяет подключаться к telnet-порту, к FTP.

Функция socket_set_blocking

int socket_set_blocking(int $sd, int $mode)

Эта функция устанавливает блокирующий или неблокирующий режим для соединения, открытого ранее при помощи fsockopen(). В режиме блокировки ($mode=true) функции чтения будут "засыпать", пока передача данных не завершится. Таким образом, если данных много, или же произошел "затор" в сети, ваша программа остановится и будет дожидаться выхода из функции чтения.

В режиме запрета блокировки ($mode=false) функции наподобие fgets() будут сразу же возвращать управление в программу, даже если через соединение не было передано еще ни одного байта данных. Таким образом, считывается ровно столько информации, сколько доступно на данный момент. Определить, что данные кончились, можно с помощью функции feof(), как это было сделано в примере из листинга 1.

Открытие соединения через сокет

РНР не ограничивается взаимодействием с файлами и процессами, вы также можете устанавливать соединения через сокеты. Сокет (socket) представляет собой программную абстракцию, позволяющую устанавливать связь с различными службами другого компьютера.

Функция fsockopen( ) устанавливает сокетное соединение с сервером в Интернете используя протокол TCP или UDP.

Синтаксис функции fsockopen( ):

int fsockopen (string узел, int порт [, int код_ошибки [, string текст_ошибки [, int тайм-аут]]])

Необязательные параметры код_ошибки и текст_ошибки содержат информацию, которая будет выводиться в случае неудачи при подключении к серверу. Оба параметра должны передаваться по ссылке. Третий необязательный параметр, тайм-аут, задает продолжительность ожидания ответа от сервера (в секундах). В листинге 2 продемонстрировано применение функции fsockopen( ) для получения информации о сервере.

Функция socket_set_b1ocki ng( ) позволяет установить контроль над тайм-аутом для операций с сервером:

socket_set_blocking(int манипулятор, boolean режим)

Параметр манипулятор задает открытый ранее сокет, а параметр режим выбирает режим, в который переключается сокет (TRUE для блокирующего режима, FALSE для неблокирующего режима). Пример использования функций fsockopen( ) и socket_set_blocking( ) приведен в листинге 2.

Листинг 2. Использование функции fsockopen() для получения информации о сервере


<?

function gethost($host.$path) {

// Открыть подключение к узлу
$fp = fsockopen($host, 80, &$errno, &$errstr, 30);

// Перейти в блокирующий режим
socket_set_blocking($fp, 1),

// Отправить заголовки
fputs($fp,"GET $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n\r\n"); 

$x = 1;

// Получить заголовки
while($x < 10) :
$headers = fgets ($fp, 4096);
print $headers;
$x++;
endwhile;

// Закрыть манипулятор
fclose($fp);

}

gethost("www. soft.com", "/");

?>

В результате выполнения кода листинга 2 выводится следующий результат:

НТТР/1.0 200 OK
Server: Microsoft-IIS/4.0
Content-location: http://www.soft.com/
Date: Sat. 19 Aug 2000 21:02:23 GMT
Content-Type: text/html
Last-Modified: Wed. 19 Jul
Content-Length: 1234

Функция pfsockopen( )

Функция pfsockopen( ) представляет собой устойчивую (persistent) версию fsockopen( ). Соединение не будет автоматически разорвано по завершении сценария, в котором была вызвана функция. Синтаксис функции pfsockopen( ):

int pfsockopen (string узел, int порт [, int код_ошибки [, string текст _ошибки [, int тайм-аут]]])

В зависимости от конкретных целей вашего приложения может оказаться удобнее использовать pfsockopen( ) вместо fsockopen( ).







  Copyright © King-dom.ru, 2008-2013       Разработка сайта SoftHolm.com