Сокеты php что это

Обновлено: 01.07.2024

Репутация: 6
Всего: 18

Сокеты в PHP. Пособие для начинающих.

Для взаимодействия с сокетами в PHP чаще всего используется функция fsockopen, синтаксис которой приведён ниже.

Больше не будет теоретизировать, сразу перейдём к практике.

Распространённые примеры использования сокетов.

Пример 1. Передаём данные и получаем страницу.

Создайте php-скрипт следующего содержания:

Теперь напишем скрипт обращения к странице и передачи переменных.

Теперь, когда создан сокет, мы может получать и передавать информацию по нему с помощью функций, используемых для работы с файлами (fread(), fwrite(), fgets(), feof()).
Этим и займёмся.

Не буду сдаваться в подробности того, какие заголовки вывел сервер, всё это вы можете прочитать в документации.

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

P.S. Довольно часто получать содержание страницы в Интернете пытаются функциями наподобие file() и file_get_contents(). Почему этого не стоит делать, читайте здесь.

Пример 2. Определить, существует ли страница в Интернете.

Довольно популярный вопрос, который обычно пробуют решать примерно так:

Справедливости ради, следует отметить, что сервер, не найдя страницу может и не возвращать 404. Вполне возможно, что он редиректнет нас, причем возвратит код 200.
Здесь приведён простейший пример, в реальных условиях, возможно, потребуются дополнительные проверки.

Пример 3. Передаём данные на сервер методом POST, не используя HTML-форму.

Самый животрепещущий вопрос на тему сокетов .
Добавьте в скрипт, к которому мы обращались в прошлом примере строчку

Сейчас будем ловить POST-данные.

Теперь наш запрос к серверу будет выглядеть таким образом:

Разберём этот запрос. Вот он:

Рассмотрим, чем этот запрос отличается от запроса из предыдущего примера.
Прежде всего, в первой строке используется "POST", а не "GET". Это значит, что после двух переносов строки будут идти данные, которые сервер, возможно, передаст PHP-интерпретатору. Кроме того, среди заголовков есть два новых для нас.

Content-length
Пример: Content-length: 2452
Длина данных, которые, грубо говоря, будут переданы после двух переносов строки. Используется, когда сервер отвечает на запрос или, как в нашем случае, если передаются POST-данные. Размер переданных данных должен быть обязательно равен этому значению.
На основе этого заголовка создается переменная окружения CONTENT_LENGTH.

Content-Type
Пример: Content-Type: text/html
Задаёт тип документа и его кодировку. Для передачи данных методом POST мы использовали application/x-www-form-urlencoded.

Чтобы передать несколько переменных методом POST, перечислите их через символ «&» (совсем как в GET), например:

Полезные ссылки

Linux is like wigwam -- no windows, no gates, apache inside.

Репутация: 4
Всего: 9

несколько не верен.

resource fsockopen ( string target [, int port [, int &errno [, string &errstr [, float timeout]]]] )

Во-первых, функция возвращает ресурс. Т.е. идентификатор соединения.
И опущен параметр timeout, он устанвливает время в течении которого мы будем пытаться соединится с ресурсом. Если в течении указанного времени соединение установить не удалось, идентификатор соединения не будет создан.

Репутация: 6
Всего: 18

Linux is like wigwam -- no windows, no gates, apache inside.

Репутация: 6
Всего: 18

Linux is like wigwam -- no windows, no gates, apache inside.

Репутация: 12
Всего: 43

Если честно, то тема абсолютно не раскрыта =(

А я то уж было хотел неблок. сокеты почитать, открываю тему. и облом.

Репутация: 46
Всего: 140

Неплохая статья на мой взгляд. держи +1

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь
  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

[ Время генерации скрипта: 0.1644 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Сокеты представляют собой чрезвычайно удобную, но в то же время плохо понятую технологию взаимодействия между двумя процессами в сети. Эти процессы могут существовать на одной и той же машине, общаясь друг с другом через локальный сокет, предназначенный для взаимодействия между процессами, либо на разных машинах через Internet. Хотя тема сокетов очень обширна, в данной статье представлены основы, которые необходимы для использования расширений РНР, предназначенных для написания собственных серверов и клиентов сокетов.

Кстати!

Для использования сокетов РНР должен быть скомпилирован с опцией ./configure --enable-sockets или же потребуется загружать расширения поддержки сокетов динамически.

�?мейте в виду, что примеры, приведённые далее в этой статье, разработаны для запуска непосредственно из окружения оболочки с использованием версии РНР командной строки. Хотя их можно запустить в Web-браузере, делать это не рекомендуется. В случае сценариев, которые создают серверы сокетов, их применение можно продемонстрировать с помощью любых программ, способных устанавливать сетевое соединение через сокеты, например, telnet (что, собственно, и рекомендуется).

Основы сокетов

Хотя существует множество типов сокетов, все функции сокетов основаны на одном и том же базовом принципе — получении данных программой В от программы А. Эти программы могут работать на одной и той же машине с применением межпроцессного взаимодействия (Interprocess Communication — IPC), либо на удаленных машинах (таких как Web-сервер и браузеры).

Сокеты могут быть надежными, выполняющими все необходимое для обеспечения передачи данных из точки А в точку В (TCP), либо ненадежными, когда данные передаются без гарантии доставки (UDP).

Сокеты также бывают "блокирующими" и "неблокирующими". Блокирующие сокеты заставляют ваше приложение ожидать до тех пор, пока данные станут доступны, в то время как неблокирующие сокеты этого не делают. Хотя, как будет показано далее, все сокеты двунаправлены, все же существует разница между сокетами клиента и сервера.

Мы с вами рассмотрим ТСР-сокеты Internet, поскольку они наиболее широко используются на сегодняшний день. Тем не менее, концепции и примеры кода, приведенные здесь, применимы к большинству операций с сокетами.

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

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

socket_create($domain, $type, $protocol);

$domain - тип создаваемого сокета и должен принимать одно из значений, перечисленных в таблице констант доменов для сокеткых соединений

$type - тип взаимодействия, которое будет осуществляться через сокет; допустимые значения приведены в таблице констант типов сокетов

$protocol - протокол, используемый данным сокетом. Этот параметр может быть любым допустимым номером протокола (см. функцию getprotobyname() ) или константой SOL_UDP или SOL_TCP для соединений TCP/UDP.

В результате выполнения эта функция либо возвращает ресурс, представляющий созданный сокет, либо булевское значение false в случае ошибки.

Функция socket_create() - это первый вызов при любом взаимодействии сокетов, который инициализирует ресурс сокета, используемый в последующих операциях. �?так, сокеты могут использоваться как локально - для IPC, так и удаленно — в стиле клиент/сервер. Контекст конкретного применения сокета называется его доменом. Доступные в РНР домены, передаваемые функции socket_create() в параметре $domain, задаются константами из таблицы:

Константы доменов для сокеткых соединений

Константа Описание
AF_INET Протокол Internet IPv4
AF_INET6 Протокол Internet IPv6
AF_UNIX Локальное межпроцессное взаимодействие

После того, как домен установлен, нужно определить Т�?П подключения для создаваемого сокета. Эти типы перечислены в следующей таблице:

Константы типов сокетов

Как видите, существует множество опций при выборе типа создаваемых сокетов. Вообще большинство сокетных соединений устанавливается с помощью сокетов SОСК_STREAM или SOCK_DGRAM. Учитывая очевидную полноту SOCK_STREAM (большая часть Internet работает по этому типу сокетов через TCP), может быть не совсем понятно, зачем нужны сокеты типа SOCK_DGRAM (используемые с протоколом UDP).

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

Теперь, когда мы прояснили, какие бывают домены и типы сокетов, последний шаг в процессе создания сокета - разобраться с протоколом, который будет использоваться для взаимодействия. Каждый протокол спроектирован для работы с определенным типом сокета, который должен быть известен заранее.

Мы будем испольэовать сокеты Internet IPv4 типа SOCK_STREAM, работающие через соединения SOL_TCP (TCP), После того, как ресурс сокета создан, он может быть уничтожен с помощью функции socket_close(), имеющей следующий синтаксис:

socket_close($socket);

Здесь $socket - это сокет, подлежащий уничтожению.

Ошибки сокетов

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

socket_last_error($socket);

Где $socket - это сокет, информацию об ошибке которого необходимо извлечь. Как следует из имени функции, она используется для того, чтобы вернуть последнюю ошибку, произошедшую в данном сокете. Эта ошибка представлена в виде целого числа. Чтобы транслировать его в понятную человеку форму, в API-интерфейсе сокетов предусмотрена дополнительная функция socket_strerror():

socket_strerror($error_code);

Где $error_code - это значение, которое получено из функции socket_last_error(). Эта функция вернет строку, описывающую ошибку, возвращенную функцией socket_last_error().

Создание клиентских сокетов.

Создание сокета, готового для подключения к другому сокету в Internet, выполняется с помощью функции socket_connect ():

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

$socket - это сокет, участвующий в соединении;

$address - IP-адрес сервера, к которому нужно подключиться;

$port - необязательный параметр - это порт сервера, к которому необходимо подключиться;

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

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

socket_write( $socket, $buffer [, $length] );

$socket — это сокет для записи данных;

$buffer - Данные для записи в сокет;

$length - (необязательный) также может быть указан при желании (в противном случае будет записан весь буфер);

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

Для чтения данных из сокета применяется функция socket_read<) со следующим синтаксисом:

socket_read($socket, $length [, $type]);

$socket — это сокет, из которого нужно прочитать максимум $length байт. Необязательный параметр $type принимает значения, описанные в таблице ниже, и указывает способ, по которому данные должны читаться из сокета.

Константы типа для socket_read()

Константа Описание
PHP_BINARY_READ �?нтерпретировать данные как бинарные (поумолчанию).
PHP_NORMAL_READ Читать данные заданной длины, либо пока не встретится символ новой строки (\r или \n).

Рассмотрев этот простой пример сокета-клиента, теперь давайте посмотрим на другую сторону соединения - простой сервер на базе сокетов.

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

Когда вы создаете серверные сокеты, почти всегда они представляют собой двунаправленные службы. В общем случае вы можете положиться на уже изученные концепции клиентских сокетных коммуникаций. Создание серверного сокета - это трех - шаговый процесс. Первый шаг - привязать сокет к определенному адресу и порту, воспользовавшись функцией 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 байта входного потока и отображающий этот поток пользователю.

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

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

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

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

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

Кстати!

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

Одновременная работа с несколькими сокетами

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

Здесь $read, $write и $error — переданные по ссылке переменные (точнее, массивы). Эти массивы должны содержать список всех сокетов, за которыми нужно наблюдать на предмет чтения, записи и перехвата ошибок соответственно. Например, помещение активного сокета в массив, передаваемый в параметре $read, заставляет РНР проверять, есть ли в этом сокете данные для чтения. Последние два параметра - $sec и необязательный $usec - это значения тайм-аута, управляющие тем, как долго будет ожидать функция socket_select(), прежде чем вернуть управление РНР.

В результате выполнения функция socket_select() возвращает целое число, указывающее общее количество измененных сокетов ( из переданного списка), и модифицирует массивы $read, $write и $error, удаляя из них те элементы, которые не были изменены. В результате каждый из этих массивов будет содержать только список сокетов, отвечающих следующим требованиям:

Сокеты, перечисленные в массиве $read, содержат данные, подлежащие чтению из них, либо входящие подключения к ним.

Сокеты, перечисленные в массиве $write, содержат данные, подлежащие записи в них.

Сокеты, перечисленные в массиве $error, содержат ошибки, которые нужно обработать.

В случае ошибочного завершения socket_select() возвращает булевское значение false.

Для использования этой функции в реальном приложении первым делом должен быть создан сокет, представляющий сервер в целом. Этот главный сокет будет привязан к определенному адресу и порту и начнет прослушивание подключений.

Этот сокет будет также добавлен в массив $read и будет запущен управляемый бесконечный цикл. Затем с помощью функции socket_select() будет организован мониторинг главного сокета на предмет новых подключений. Когда появляется новое подключение, автоматически вызывается функция socket_accept(), что приводит к созданию нового серверного сокета, используемого для взаимодействия с подключенным клиентом.

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

Создание многосортного сервера на РНР

Кстати!

В листинге выше вскрыты некоторые ограничения сценарного механизма РНР, которые требуют несколько более сложного обходного пути в форме вызова socket_select():

$num_changed = socket_select($read, $NULL, $NULL, 0, 10);

Обратите внимание на применение переменной с именем $NULL. В РНР для функций, принимающих параметры по ссылке (как это и делает socket_select() в первом приближении), NULL является недопустимым значением. Однако передача NULL в качестве одного или более параметров-списков вполне корректна. Поэтому обходной маневр заключается в присвоении переменной $NULL значения NULL:

$NULL = NULL;

�? последующей ее передачи функции socket_select().

В этой статье речь пойдёт о протоколе WebSocket, немного теории и реализация его в браузере через JavaScript и на сервере на «голом» php.

Веб-сокет

Оглавление

Общая информация о веб-сокетах

Реализация клиента на Javascript

Протокол веб-сокет создан уже давно (приобрёл статус RFC в 11.12.2011) и поддерживается большинством браузеров. Чтобы узнать поддерживает ли ваш браузер веб-сокеты перейдите по ссылке.

Работа в браузерах с вебсокетам проходит в несколько этапов:

Этап. Рукопожатие

Чтобы создать соединение по веб-сокету достаточно создать объект WebSocket, в котором указывается урл для подключения.

Используйте протокол «ws://», если нужно не шифрованное соединение или протокол «wss://» для шифрованного соединения.

Этап. Создание обработчиков событий.

После того как мы создали объект WebSocket необходимо повесить функции-обработчики на события.

Если нужно повесить несколько функций на событие используем методы «addEventListener» и «removeEventListener». Пример:

Обработка приходящих данных лежит уже на стороне сервера. Чаще для удобства работы по вебсокету отправляют JSON данные серилизованные в строку и обрабатывают приходящие данные как строка в JSON-e. Пример использования:

Параметры json-rpc объекта:

Чтобы закрыть соединение используем метод close().

Протокол WebSocket

Рукопожатие. Запрос браузера

в котором обязательно должы присутствовать эти заголовки:

  • GET, Host - стандартные заголовки
  • Connection, Upgrade - браузер хочет перейти на новый протокол
  • Origin - адрес с которого отправлен запрос. Мы можем это учитывать или нет.
  • Sec-WebSocket-Key - случайный ключ, который генерируется браузером в кодировке Base64, нужен чтобы понять, что ответ от сервера на подключение предназначен именно ему.
  • Sec-WebSocket-Version - версия протокол. Последняя версия 13.

Также есть дополнительные заголовки:

Рукопожатие. Ответ сервера

  • Соединяем «Sec-WebSocket-Key» со строкой «258EAFA5-E914-47DA-95CA-C5AB0DC85B11», это строка прописана в RFC 6455 для веб-сокетов.
  • Далее вычисляем бинарный SHA1 по полученной строке.
  • И наконец кодируем строку алгоритмом base64.

В PHP вычисление «Sec-WebSocket-Accept» будет выглядит так:

Формат фрейма по 32 бита, как в RFC.

Формат фрейма по 16 бит.

Разберём первые 16 бит фрейма (далее заголовок фрейма):

Фрейм может быть замаскирован, а может быть и нет:

  • Фрейм поступающий от браузера может быть замаскирован, а может быть и нет.
  • Фрейм поступающий от сервера должен быть не замаскирован (хотя некоторые браузеры понимают замаскированные фреймы).

Реализация сервера на PHP

Исходники простого WebSocket echo-сервера выложил сюда. Код хорошо документирован, но я всё же опишу некоторые тонкости реализации. Чтобы «поднять» WebSocket сервер нужно создать обычный TCP-сервер. В PHP TCP-сервер реализуется через «stream_socket» или через PHP расширение «sockets». Различия между ними в том, что «stream_socket» работает на встроенных функциях PHP для работы с потоками, «sockets» же работает через модуль PHP и повторяет функции для работы с сокетами в языке «C». Я выбрал «sockets».

Когда говорят сокет, то часто представляют себе что-то абстрактное, и связанное с сетевыми передачами. Но если выразится конкретнее, то получится что сокет, например, как протокол IP, это совокупность адреса (хоста) и порта. Адрес (хост) на текущий момент представляет из себя 32-x битный адрес. Наиболее часто его представляют в символьной форме mmm.nnn.ppp.qqq (адрес, разбитый на четыре октета по одному байту в октете и разделенный точками). Порт - это номер порта в диапазоне от нуля до 65535. Так вот, эта пара и есть сокет (гнездо в в котором расположены адрес и порт). В процессе обмена, как правило используются два сокета - сокет отправителя и сокет получателя.

PHP позволяет скрипту соединиться с помощью сокетов к любому хосту и порту с помощью функции fsockopen. Функция fsockopen предназначена для соединения клиента с сервером. Она очень удобна, поскольку является универсальной и объединяет в себе те функции, которые есть в PHP для работы с сокетами.

Что же делают сокеты? С помощью сетевых протоколов они обмениваются между собой запросами. Существуют такие виды сетевых протоколов:
TCP - протокол управления передачей (Transmission Control Protocol).
TCP/IP - (Transmission Control Protocol/Internet Protocol) - набор сетевых протоколов, позволяющих компьютерам (различных аппаратных платформ и с разными операционными системами) взаимодействовать по соединенным сетям и через Интернет. Любой компьютер в Интернете поддерживает tcp/ip. Это базовый протокол, используемый Internet.
UDP - дополнительный компонент протокола tcp, поддерживающий выполняющуюся без подключений службу датаграмм, не гарантирующую ни доставку, ни правильную последовательность доставленных пакетов (аналогично протоколу ip).
FTP - один из протоколов tcp/ip, используемый для копирования файлов с одного компьютера на другой через Интернет. При этом оба компьютера должны поддерживать соответствующие роли ftp: один должен быть клиентом ftp, а другой - сервером ftp.
SSL - протокол, обеспечивающий защиту передаваемых данных с помощью шифров.
TLS - стандартный протокол, используемый для обеспечения безопасности веб коммуникаций в Интернете и интрасетях. Позволяет клиентам проверять подлинность серверов или (необязательно) серверам проверять подлинность клиентов. Также обеспечивает безопасный канал за счет шифрования соединений. Протокол tls является самой последней и более безопасной версией протокола ssl.
SMTP (Simple Mail Transfer Protocol) - что означает простой протокол передачи электронной почты;
POP (Post Office Protocol) - почтовый протокол для приема электронной почты.

(далее следует код запрошенной страница в HTML)

Запрос клиента начинается с команды GET. Каждый сервер должен поддерживать как минимум две команды GET и HEAD. Посмотрите какие еще существуют основные команды:
GET - используется для запроса содержимого указанного ресурса (страницы). В результате этой команды сервер должен выполнить запрос и возвратить ответ. Как правило, все клиенты (браузеры) для получения страницы сайта по url используют get.
HEAD - аналогичен методу GET, за исключением того, что в ответе сервера отсутствует тело. Другими словами обратно Вы получите только заголовок ответа сервера, но не код страницы.
POST - применяется для передачи пользовательских данных заданному ресурсу. Эти данные могут быть в виде файла или просто текста. Как правило, название переменной и ее значение.
TRACE - возвращает полученный запрос так, что клиент может увидеть, что промежуточные сервера добавляют или изменяют в запросе.

Диапазон кодов Значение ответа
100–199 Информационный
200–299 Запрос клиента успешен
300–399 Запрос клиента переадресован, необходимы дальнейшие действия
400–499 Запрос клиента является неполным
500–599 Ошибки сервера

Код Значение ответа
200 Запрошенный документ найден и сейчас будет выслан.
301, 302 Запрошенный документ навсегда перенесен в другое расположение. При этом в поле Location будет указано новое расположение документа.
401 Запрошенный документ присутствует, однако для его получения требуется авторизация на сервере.
402 Запрошенный документ (страница) не найден на сервере.
500 Произошла внутренняя ошибка сервера. Как правило, такие ошибки возникают при коллизиях между CGI-программой и сервером.

В нашем примере код ответа сервера имеет значение 200 OK. Это означает, что указанная в клиент-запросе страница найдена и ответ успешно возвращается. Последующие строчки, я думаю, Вам должны быть понятны интуитивно.

Что ж, мы сделали краткое вступление к понятию сокетов в php и теперь можем смело приступить к написанию нашего сокета в php.
Как я уже выше писал, для создания сокетов в php используется функция fsockopen. Посмотрите на этот код:

Читайте также: