Клиентские приложения

May 4, 2010 by admin Комментировать »

Задача клиентского приложения, использующего сокеты, — открытие сокета определенного хоста, считывание данных или запись их в этот сокет и его закры­тие. Можно сказать, что. открывая сокет на удаленной машине (или локально), происходит открытие потока данных, подобного тому, который используется при работе с файлами в стиле языка С (функции fwrite (), f gets () и др.). Здесь даже действуют те же функции, за исключением одной: для открытия сокета использу­ется функция fsockopen (а не fopen), а вот для записи и считывания — все те же fwrite(), fgets() — и fclose() для закрытия. Список доступных функций есть в главе 11 данной книги (см. раздел "Работа с файлами в стиле С") и более полный список имеется в официальной документации по адресу:

www.php.net/manual/ru/ref.filesystem.php.

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

resource fsockopen ( string target, int port [, int Sterrno [, string Serrstr [, float timeout]]] )

. В параметры target и port передаются наименование хоста и порт подключе­ния соответственно. Параметры errno и errstr получают информацию об ошибке, если таковая возникнет, и параметр timeout указывает время в секундах, в тече­ние которого клиентский скрипт будет пытаться подключиться к хосту.

Рассмотрим простой пример клиентского скрипта для подключения к Web-серверу. В обычных условиях из РНР-скриптов прямых обращений к Web-серверу не происходит. Чаще всего такие обращения исходят от пользователя, набирающе­го адреса и переходящего по ссылкам в своем браузере. Однако и РНР-скрипт мо­жет инициировать HTTP-запрос и получить в результате текст всего HTTP-ответа целиком.

<?php

//Открьюаем сокет

$fp = fsockopen("localhost", 80, Serrno, Serrstr, 30); if (!$fp) {

echo "$errstr ($errno)<br />\n"; } else {

//подготавливаем строку запроса $out = "GET /my.htm HTTP/1.l\r\n"; $out .= "Host: localhost\r\n"; Sout "Connection: Close\r\n\r\n"; //отправляем в поток запрос fwrite($fp, $out); while (!feof($fp)) {

//считьшаем построчно ответ на запрос echo fgets($fp, 1024);

}

//закрываем сокет fclose($fp);

}

?>

В данном примере открывается сокет, работающий на восьмидесятом порту хос­та localhost, запрашивается страница ту. htm по протоколу http (надстройка над TCP/IP) и полученный ответ выводится на экран. Обычно на восьмидесятом порту работает Web-сервер, поэтому если он установлен и запущен, а так же в корневой директории имеется файл ту. htm, то скрипт может вывести на экран следующую информацию.

НТТР/1.1 200 СК

Date: Wed, 29 Jun 2005 12:10:21 GMT Server: Apache/1.3.29 (Win32) PHP/5.0.4 Last-Modified: Wed, 29 Jun 2005 12:07:40 GMT ETag: "0-21-42c28fOc" Accept-Ranges: bytes Content-Length: 33 Connection: close Content-Type: text/html

<html>

<Ь1>Привет!</hl>

</html> .

Несложно догадаться, что это обычный HTTP-ответ от Web-сервера, который состоит из HTTP-заголовков и текста странички ту.htm. Если файла my.htm на сервере не окажется, то Web-сервер может вернуть HTTP-ответ с ошибки:

НТТР/1.1 404 Not Found

Date: Wed, 29 Jun 2005 12:19:49 GMT

Server: Apache/1.3.29 (Win32) PHP/5.0.4

Connection: close

Transfer-Encoding: chunked

Content-Type: text/html; charset=iso-8859-l 10a

<‘DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <HTML><HEAD>

<TITLE>404 Not Found</TITLE>

</HEAD><BODY>

<Hl>Not Found</Hl>

The requested URL /my.htm was not found

on this server.<P> <HR>

<ADDRESS>Apache/1.3.29 Server at localhost

Port 80</ADDRESS> </BCDY></HTML>

0

Это HTTP-ответ со стандартным сообщением об ошибке 404.

Таким образом можно подключаться к любым доступным портам на удаленных машинах (или локально) и производить дозволенные действия (посылая запросы и считывая ответы).

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты