PHP: Программирование сокетов - Создание серверных сокетов

PHP: Программирование сокетов - Создание серверных сокетов

Индекс материала
PHP: Программирование сокетов
Создание клиентских сокетов.
Создание серверных сокетов
Одновременная работа с несколькими сокетами
Все страницы

Создание серверных сокетов

Когда вы создаете серверные сокеты, почти всегда они представляют собой двунаправленные службы. В общем случае вы можете положиться на уже изученные концепции клиентских сокетных коммуникаций. Создание серверного сокета - это трех - шаговый процесс. Первый шаг - привязать сокет к определенному адресу и порту, воспользовавшись функцией socket_bind():

socket_bind( $socket, $address [,$port] );

Здесь $socket — это сокет, который подлежит привязке к адресу $address. Если сокет существует в домене AF_INET или AF_INET6, необязательный параметр $port должен быть указан. При выполнении эта функция пытается привязать созданный сокет к указанным адресу и порту и возвращает булевское значение, указывающее на успешность операции.

Кстати!

Когда осуществляется привязка к адресу, убедитесь, что ваш сокет не допустит подключений к чему-либо другому, кроме указанного адреса и порта! Это означает, что привязка сокета к локальному хосту (127.0.0.1) позволит вашему сокету принимать топько покальные подключения.

Второй шаг: настроить сокет на прослушивание трафика на предмет попыток подключения к нему. Это делается с помощью функции socket_listen():

socket_listen($socket [, $backlog] );

Где $socket - привязанный ранее сокет, который должен быть включен на прослушинание. Необязательный параметр $backlog используется для создания очереди посредством указания максимально допустимого числа входящих подключений, помещаемых в очередь. Если этот параметр не указан, то сокет, пытающийся подключиться, получит отказ в обслуживании, пока серверный сокет недоступен. В результате выполнения эта функция возвращает булевское значение, указывающее на успешность настройки серверного сокета на прослушивание.

Третий и последний шаг в создании серверного сокета — дать команду на прием входящих подключений. Это делается функцией socket_accept ():

socket_accept($socket);

Где $socket — привязанный сокет, включенный на прослушивание, который должен принимать соединения.

При выполнении эта функция не вернет управление до тех пор, пока не завершится ожидание входящих подключений. Как только оно будет установлено, функция вернет новый сокетный ресурс, используемый для подключения. Если указанный в параметре $socket сокет настроен как неблокирующий, функция socket_accept() всегда немедленно будет возвращать false.

Кстати

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

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

Создание простого сервера на основе сокета

  <?php
  
    $address = "127.0.0.1";
    $port = 4545;
    
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    
    if( !$socket ) exit( socket_strerror( socket_last_error() ) );
    else echo 'Socket_created!'."\r\n";
    
    if( !socket_bind($socket, $address, $port) ) exit( socket_strerror( socket_last_error() ) );
    else echo 'Socket_binded!'."\r\n";
    
    if( !socket_listen($socket, 10) ) exit( socket_strerror( socket_last_error() ) );
    else echo 'Socket_listen!'."\r\n";
    
    $connect = socket_accept($socket);
    
    $result = socket_read($connect,1024);
    
    echo 'Common data: '.$result."\r\n";
    
    socket_write($connect,'You sending me: '.$result."\r\n");
    
    socket_shutdown($connect);
    socket_close($socket);
    
  ?>

У меня на компе этот скрипт лежит в папке денвера по пути: C:\WebServers\home\app.loc\www\sockets\test.php
Теперь, если запустить наш скрипт из командной строки таким макаром: C:\WebServers\home\app.loc\www\sockets>php test.php В командной строке мы увидим следующее:


  C:\WebServers\home\app.loc\www\sockets>php test.php
  Socket_created!
  Socket_binded!
  Socket_listen!
    

Однако - Ура! - Наш сервер завёлся и теперь висит на порту 4545, как процесс ( благодаря функции socket_accept ) теперь самое время обратиться к нему. Идём в браузер и набираем в адресной строке: http://127.0.0.1:4545/?send=hello_server тут надеюсь всё понятно куда и что мы запросили

Сервер в ответ пришлёт нам наш же запрос + заголовки:

  You sending me: GET / ? send = hello_server HTTP / 1.1
  Host : 127.0.0.1: 4545
  Connection: keep - alive
  Cache - Control: max - age = 0
  User - Agent: Mozilla / 5.0(Windows NT 5.2; WOW64) AppleWebKit / 535.1(KHTML, like Gecko) Chrome / 14.0.835.186 Safari / 535.1
  Accept: text / html,
  application / xhtml + xml,
  application / xml;q = 0.9,
  *
  /*;q=0.8
  Accept-Encoding: gzip,deflate,sdch
  Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
  Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3  
  
  */

В командной строке мы увидим новые данные


  C:\WebServers\home\app.loc\www\sockets>php test.php
  Socket_created!
  Socket_binded!
  Socket_listen!
  Common data: GET /?send=hello_server HTTP/1.1
  Host: 127.0.0.1:4545
  Connection: keep-alive
  Cache-Control: max-age=0
  User-Agent: Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.83
  5.186 Safari/535.1
  Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  Accept-Encoding: gzip,deflate,sdch
  Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
  Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3

А так же новое приглашение ввода - свидетельство о том, что процесс отрубился. Это можно так же проверить командой netstat -a и убудиться, что порт 4545 в списке не присутствует.

Кстати!

Чтобы создать сервер, сокеты которого ведут прослушивание на портах с номерами ниже 1000, данный пользователь должен иметь в системе административные права. Также следует отметить, что приведенный выше сценарий не завершит работу до тех пор, пока не будет установлено соединение, что может создать впечатление "зависания".



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


Защитный код
Обновить






Кто на сайте
Сейчас 27 гостей онлайн