Нажмите CTRL-D чтобы добавить нас в закладки
Внимание! Вы находитесь в незащищенном режиме (HTTP). Для перехода в защищенный режим SSL, нажмите здесь
HackZone.RU - Использование сокетов в PHP
Войти / Регистрация / Участники
Определение даты выпуска iPhone по серийному номеру
-
Поиск по сайту
Форумы



Реклама

Поиск ТОП Добавить публикацию

Использование сокетов в PHP

15.06.2010

PHP может открывать соккеты на локальной или удаленной машине. В
   данной статье будет рассмотрен пример использования соккетов для:
   соединения с Usenet-новостным сервером, ведения диалога с ним и
   скачивания некоторых статей.

Открываем сокет.

   Для открываения соккета используется функция fsockopen(). Эта функция
   доступна, как в PHP3, так и PHP4. Вызов функции имеет следующий вид:

       int fsockopen (string hostname, int port [, int errno [, string errstr [, double timeout]]])


   Для UDP соединения, надо определить протокол: udp://hostname.

   Больше информации о функции fsockopen() можно узнав здесь:
   http://www.php.net/manual/function.fsockopen.php


NNTP-протокол (Network News Transfer Protocol)

   Для доступа к новостному usenet-серверу мы будем использовать
   NNTP-протокол.

   Этот протокол детально описан в RFC977 (Request For Comment number 977).
   Полное описание присутствует в интернете:
   http://www.w3.org/Protocols/rfc977/rfc977.html

   Этот документ детально описывает процедуру соединения и диалога с
   сервером.


Соединение (Connecting)

   Для соединения с NNTP-сервером нам необходимо знать его имя (или
   IP-адрес) и порт. Так же необходимо указывать таймер, чтобы в случае
   невозможности подсоединения к серверу не "заморозили" application.

           <?php
           $cfgServer = "your.news.host";
           $cfgPort = 119;
           $cfgTimeOut = 10;
           // open a socket
           if(!$cfgTimeOut)
               // without timeout
               $usenet_handle = fsockopen($cfgServer, $cfgPort);
           else
               // with timeout
               $usenet_handle = fsockopen($cfgServer, $cfgPort, &$errno, &$errstr, $cfgTimeOut);
           if(!$usenet_handle) {
               echo "Connexion failed\n";
               exit();
           }
           else {
               echo "Connected\n";
               $tmp = fgets($usenet_handle, 1024);
           }
           ?>


Ведение диалога с сервером.

   Итак, теперь мы присоединились к серверу и можем вести диалог с ним,
   используя ранее открытый соккет. Для примера, попробуем достать десять
   последних сообщений с какой-либо группы. В RFC977 описано, что первый
   шаг - выбрать группу с помощью GROUP комманды:

       GROUP ggg


   Обязательный парамтор - ggg  - имя группы, которую мы хотим выбрать
   (например, "net.news"). Список существующих групп может быть получен с
   помощью комманды LIST. Удачный выбор группы будет подтвержден ответом
   сервера, где будет сообщаться колличество новых, старых статей и общее
   колличество.

       chrome:~$ telnet my.news.host 119
       Trying aa.bb.cc.dd...
       Connected to my.news.host.
       Escape character is '^]'.
       200 my.news.host InterNetNews NNRP server INN 2.2.2 13-Dec-1999 ready (posting ok).
       GROUP alt.test
       211 232 222996 223235 alt.test
       quit
       205 .


   После получения комманды "GROUP alt.test", новостной сервер ответил
   "211 232 222996 223235 alt.test". 211 - определенный RFC спецификацией
   код (говоря обычным языком - 212 - означает, что команда была
   завершена с положительным результатом - смотрите документацию RFC для
   более полной характеристики). Следующая цифра - 232 - колличество
   имеющихся в текущий момент новых статей. 222996 - старых. 223235 -
   всего статей. 232+222996 не равно 223235. Почему? Возможно,
   недостающие семь статей были каким-либо образом удалены модератором
   или самим автором.


   В зависимости от сервера (public или private) вас могут попросить
   идентифицироваться. Так-же возможно, что идентификация понадобиться
   только при написании своих сообщений, а чтение может производиться без
   этого.

           <?php
           //$cfgUser = "xxxxxx";
           //$cfgPasswd = "yyyyyy";
           $cfgNewsGroup = "alt.php";
           // identification required on private server
           if($cfgUser) {
               fputs($usenet_handle, "AUTHINFO USER ".$cfgUser."\n");
               $tmp = fgets($usenet_handle, 1024);
               fputs($usenet_handle, "AUTHINFO PASS ".$cfgPasswd."\n");
               $tmp = fgets($usenet_handle, 1024);
               // check error
               if($tmp != "281 Ok\r\n") {
                   echo "502 Authentication error\n";
                   exit();
               }
           }
           // select newsgroup
           fputs($usenet_handle, "GROUP ".$cfgNewsGroup."\n");
           $tmp = fgets($usenet_handle, 1024);
           if($tmp == "480 Authentication required for command\r\n") {
               echo "$tmp\n";
               exit();
           }
           $info = split(" ", $tmp);
           $first = $info[2];
           $last = $info[3];
           print "First : $first\n";
           print "Last : $last\n";
           ?>


Скачивание некоторых статей

   Теперь мы имеем номер последней статьи, так что сейчас нам не составит
   труда скачать десять последних статей. RFC977 спецификация допускает
   использование комманды ARTICLE, как с номером статьи, так и Message ID
   (Уникальный Номер Сообщения).

   Будтье внимательны здесь - номер статьи отличен от Message ID. Если
   статья опубликованна на нескольких серверах, то она несомненно будет
   иметь разный номер оба раза, но одинаковый Message ID. Грубо говоря,
   номер статьи - присваивается каждый раз по-новому на сервере, и может
   меняться со временем; Message ID - у каждой статьи уникальный.

           <?php
           $cfgLimit = 10;
           // upload last articles
           $boucle=$last-$cfgLimit;
           while ($boucle <= $last) {
           set_time_limit(0);
           fputs($usenet_handle, "ARTICLE $boucle\n");
           $article="";
           $tmp = fgets($usenet_handle, 4096);
           if(substr($tmp,0,3) != "220") {
               echo "+----------------------+\n";
               echo "Error on article $boucle\n";
               echo "+----------------------+\n";
           }
           else {
               while($tmp!=".\r\n") {
                   $tmp = fgets($usenet_handle, 4096);
                   $article = $article.$tmp;
               }
               echo "+----------------------+\n";
               echo "Article $boucle\n";
               echo "+----------------------+\n";
               echo "$article\n";
           }
           $boucle++;
           }
           ?>


   Так-же благодаря комманде HEAD возможно получить только хэадер
   (header) сообщения или-же только текст, используя команду BODY.


Отсоединяемся от сервера

   Чтобы закрыть сессию с NNTP-сервером, просто закройте соккет используя
   fclose() (аналагично закрытию фаила).


   Больше информации о функции fclose() можно узнать здес:
   http://www.php.net/manual/function.fclose.php


           <?php
           // close connexion
           fclose($usenet_handle);
           ?>


Заключение

   Мы только что видели как открыть, использовать и затем закрыть соккет
   - для соединения с NNTP-сервером и получения некоторых статей из
   новостных групп.

   Для опубликования сообщения необходимо использовать POST комманду.


   Примеры приложений работующих с новостными группами можно найти здесь:
   http://www.phpindex.com/ng/

Авторы: Denis Roshchin, Armel Fauveau


При копировании материалов ссылка на HackZone.RU обязательна

Добавить страницу в закладки

 Детали
Категория: Программирование
Опубликовал: BRe@K
Просмотров: 7368
Проголосовало через SMS: 0
  Разместить у себя на сайте
Прямая ссылка
HTML
BBCode ссылка
BBCode ссылка с текстом

 Комментарии (оставить свой комментарий можно здесь)
Только зарегистрированные пользователи могут оставлять комментарии

Зарегистрироваться *** Авторизоваться


 Последние новости и статьи  Последние сообщения с форумов
  • Google Pixel взломали за 60 секунд
  • В CMS Joomla обнаружена критическая 0-day уязвимость
  • ФБР не смогло взломать протокол шифрования переписки террористов ...
  • Полиция обыскала дом предполагаемого создателя платежной системы ...
  • Google: квантовый ПК будет в 100 млн раз быстрее стандартных чипо...
  • "Лаборатория Касперского" констатирует усиление атак кибергруппир...
  • Microsoft Edge откроет исходные коды ChakraCore
  • Anonymous объявили 11 декабря «днём троллинга» ИГИЛ
  • Миллионы телевизоров, смартфонов и маршрутизаторов оказались уязв...
  • Adobe прощается с Flash

    Все новости... Все статьи... Прислать новость RSS
  • Сети / Общее » Помогу прочитать viber/whats app переписку
  • Разное / Предложения работы » Re: HACKtheВзлом Gmail,Mail, Ya, Rambler, Yahoo, Ok ,Vk,What...
  • Разное / Предложения работы » Нужен слив базы
  • Интернет / Хостинг » Re: Список бесплатных хостов.
  • Интернет / Хостинг » Re: посоветуйте хостинг под фишинг
  • Интернет / Хостинг » Re: Бесплатный домен + хостинг
  • Интернет / Хостинг » Re: Обузоустойчивый хостинг
  • Hardware / Общее » Re: Замучил синий экран
  • Интернет / Разное » Re: Взлом социальных сетей и почтовых ящиков.
  • Интернет / Платежные системы » Re: Безопасное обезличенное обналичивание интернет денег - ?...

    Все форумы... RSS


  • Разместить рекламу
    © HackZone Ltd. 2007-2012. Все права зарегистрированы.
    Перепечатка материалов без согласования и указания источника будет преследоваться по Закону

    О проекте | История проекта | Размещение рекламы | Обратная связь | Правила поведения на портале
    Ya-Cyt службы мониторинга серверов

    #{title}

    #{text}

    x

    #{title}

    #{text}