• Системы Windows легко встраиваются в сети, использующие как версию IPv4 протокола TCP/IP, так и постепенно распространяющуюся версию IPv6. Помимо всего остального, версия IPv6 допускает использование более длинных IP-адресов, преодолевая существующий 4-байтовый адресный барьер версии IPv4. Системы Windows легко встраиваются в сети, использующие как версию IPv4 протокола TCP IP, так и постепенно распространяющуюся версию IPv6. Параметры сокетов SCTP Относительно большое количество параметров, определенных для сокетов SCTP 17 на момент написания этой книги , дают возможность разработчику приложения более точно контролировать его поведение.

PHP: Программирование сокетов

Кстати!

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

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

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

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

Черноволов Василий Петрович, эксперт по вопросам мобильной связи и интернета
Мнение эксперта
Черноволов Василий Петрович, эксперт по вопросам мобильной связи и интернета
Все сложные вопросы мы с вами решим вместе.
Задать вопрос эксперту
Когда взаимодействующие модули решают прекратить передачу данных и закрыть сеанс связи, они обмениваются трехсторонним рукопожатием с сегментами, содержащими установленный бит От отправителя больше нет данных этот бит еще называется FIN бит. Если вам нужна бесплатная консультация, пишите мне!

А. Танаев. Программирование сокетов

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

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

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

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

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

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

В листинге ниже представлен пример использования сокетов для извлечения индексной страницы Web-сайта, в него включено все, что рассматривалось выше. �?звлечение индексной страницы осуществляется отправкой простого GET-запроса HTTP 1.0 с последующим чтением результата в переменную. В результате выполнения функция socket_select возвращает целое число, указывающее общее количество измененных сокетов из переданного списка , и модифицирует массивы read, write и error, удаляя из них те элементы, которые не были изменены. При выполнении эта функция пытается привязать созданный сокет к указанным адресу и порту и возвращает булевское значение, указывающее на успешность операции.

Программирование сокетов

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

Для создания сокета используется системный вызов socket.

Функция socket создает конечную точку для коммуникаций и возвращает файловый дескриптор, ссылающийся на сокет, или -1 в случае ошибки. Данный дескриптор используется в дальнейшем для установления связи.

Для создания сокета типа stream с протоколом TCP, обеспечивающим коммуникационную поддержку, вызов функции socket должен быть следующим:

Привязка к локальным именам

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

Для связывания сокета с адресом и номером порта используют системный вызов bind:

Привязываемое имя (name) это строка байт переменной длины, которая интерпретируется поддерживаемым протоколом. Интерпретация может различаться в различных коммуникационных доменах.

Установление связи

Со стороны клиента связь устанавливается с помощью стандартной функции connect:

которая инициирует установление связи на сокете, используя дескриптор сокета s и информацию из структуры serveraddr, имеющей тип sockaddr_in, которая содержит адрес сервера и номер порта на который надо установить связь. Если сокет не был связан с адресом, connect автоматически вызовет системную функцию bind.

Connect возвращает 0, если вызов прошел успешно. Возвращенная величина -1 указывает на то, что в процессе установления связи произошла некая ошибка. В случае успешного вызова функции процесс может работать с дескриптором сокета, используя функции read и write, и закрывать канал используя функцию close.

Со стороны сервера процесс установления связи сложнее. Когда сервер желает предложить один из своих сервисов, он связывает сокет с общеизвестным адресом, ассоциирующимся с данным сервисом, и пассивно слушает этот сокет. Для этих целей используется системный вызов listen:

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

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

Сокет, ассоциированный клиентом, и сокет, который был возвращен функцией accept, используются для установления связи между сервером и клиентом.

Передача данных

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

Программирование сокетов.
Ниже приведены тексты двух простых программ на языке С — клиента и сервера, — взаимодействующие через протокол TCP, используя интерфейс сокетов. Операционная система — Solaris.
Черноволов Василий Петрович, эксперт по вопросам мобильной связи и интернета
Мнение эксперта
Черноволов Василий Петрович, эксперт по вопросам мобильной связи и интернета
Все сложные вопросы мы с вами решим вместе.
Задать вопрос эксперту
Для преобразования адреса, содержащегося в структуре типа struct in_addr , в точечно-десятичную нотацию используется функция inet_ntoa , возвращающая указатель на строку символов, содержащую требуемый адрес в виде d. Если вам нужна бесплатная консультация, пишите мне!

PHP: Программирование сокетов

  • MSG_OOB — Посылать/получать данные, характерные для сокетов типа stream.
  • MSG_PEEK — Просматривать данные без чтения. когда указывается в recv, любые присутствующие данные возвращаются пользователю, но сами данные остаются как «непрочитанные». Следующий read или recv вызванный на данном сокете вернет прочитанные в прошлый раз данные.
  • MSG_DONTROUTE — посылать данные без маршрутизации пакетов. (Используется только процессами, управляющими таблицами маршрутизации.)
Оцените, пожалуйста, публикацию:
Загрузка...

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *