Elettracompany.com

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Socket bind php

27.3.2. Создание и связывание сокета

27.3.2. Создание и связывание сокета

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

? socket() — создание сокета;

? bind() — связывание сокета;

? close() и shutdown() — завершение сеанса связи.

Начнем по порядку, а именно, с функции socket(). Ее прототип следующий:

extern int socket(int __domain, int __type,

int __protocol) __THROW;

Первый аргумент определяет набор протоколов. Особо вдаваться в подробности не будем — просто всегда в качестве параметра domain передавайте значение AF_INET, что означает использование стека протоколов TCP/IP.

Аргумент type позволяет установить режим работы: с установлением соединения и без такового — значения SOCK_STREAM и SOCK_DGRAM соответственно. Для непосредственного доступа к протоколам IPv4 используется параметр SOCK_RAW. Для его использования нужно подключить заголовочный файл:

Третий параметр лучше всего установить равным 0. В этом случае будет выбран протокол по умолчанию в зависимости от режима работы:

TCP, если мы выбрали режим SOCK_STREAM;

UDP, если мы выбрали SOCK_DGRAM.

Если вы установили значение SOCK_RAW, вы можете указывать в качестве последнего параметра непосредственно значения из файла /etc/protocols . Фрагмент этого файла приведен ниже.

Листинг 27.2. Фрагмент файла /etc/protocols

ip 0 IP # Протокол Интернета

icmp 1 ICMP # Протокол ICMP

igmp 2 IGMP # Протокол IGMP

# (Internet Group Management Protocol)

ggp 3 GGP # Протокол GGP (gateway-gateway )

tcp 6 TCP # Протокол TCP

udp 17 UDP # Протокол UDP

Если сокет создан успешно, функция возвращает дескриптор сокета — целое положительное число. В случае ошибки функция возвращает значение -1 (отрицательное число). Вот небольшой пример:

sock = socket(AF_INET, SOCK_STREAM, 0);

printf(«Ошибка при создании сокета «);

Чтобы связать созданный нами сокет с локальным портом, например, 1234, нужно использовать системный вызов bind():

extern int bind(int fd, struct sockaddr *addr,

socklen_t len) __THROW;

Первый аргумент функции задает дескриптор нашего сокета. Второй — это указатель на структуру типа sockaddr. Все структуры данного типа определены в файле socket.h :

Мы программируем для сети TCP/IP, поэтому будем использовать структуру sockaddr_in (для IPv4) или sockaddr_in6 (для IPv6).

Последний аргумент — это длина выбранной нами структуры (sockaddr_in) в байтах.

Структура sockaddr_in определена в файле in.h так:

in_port_t sin_port; /* Номер порта */

struct in_addr sin_addr; /* IP-адрес */

unsigned char sin_zero[sizeof (struct sockaddr) —

sizeof(in_port_t) — sizeof (struct in_addr)];

in_port_t sin6_port; /* Порт транспортного уровня */

uint32_t sin6_flowinfo; /* Информация потока IPv6 */

struct in6_addr sin6_addr; /* адрес IPv6 */

uint32_t sin6_scope_id; /* IPv6-идентификатор */

Поля структуры sockaddr_in означают следующее:

? sin_ — набор используемых протоколов. Так как мы используем TCP/IP, данное поле должно содержать значение AF_INET;

? sin_port — номер порта;

? sin_addr — структура, определяющая адрес узла;

? sin_zero — обычно не используется.

Структура struct in_addr, определяющая адрес узла, также описана в файле in.h :

Обычно поле s_addr должно принимать значение INADDR_ANY — сейчас поясню почему. Структура sockaddr_in должна быть заполнена ДО вызова функции bind(). Если поле sin_addr.s_addr принимает значение INADDR_ANY, то функция bind() автоматически привяжет к сокету адрес локального компьютера и нам не нужно будет указывать его явно — так наша программа будет универсальной.

Функция bind() возвращает 0 в случае успеха, и -1, если произошла ошибка. Вот небольшой пример использования этой функции:

struct sockaddr_in client;

Данный текст является ознакомительным фрагментом.

Читать книгу целиком

Похожие главы из других книг:

Неявное связывание

Неявное связывание Неявное связывание, или связывание во время загрузки (load-time linking) является простейшей из двух методик связывания. Порядок действий в случае использования Microsoft C++ следующий:1. После того как собраны все необходимые для новой DLL функции, осуществляется

Явное связывание

Явное связывание Явное связывание, или связывание во время выполнения (run-time linking), требует, чтобы в программе содержались конкретные указания относительно того, когда именно необходимо загрузить или освободить библиотеку DLL. Далее программа получает адрес запрошенной

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

Создание сокета Инициализировав Winsock DLL, вы можете использовать стандартные (Berkeley Sockets) функции для создания сокетов и соединений, обеспечивающих взаимодействие серверов с клиентами или взаимодействие равноправных узлов сети между собой.Используемый в Winsock тип данных

Связывание сокета

Связывание сокета Следующий шаг заключается в привязке сокета к его адресу и конечной точке (endpoint) (направление канала связи от приложения к службе). Вызов socket, за которым следует вызов bind, аналогичен созданию именованного канала. Однако не существует имен, используя

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

17.3.1. Создание сокета Новые сокеты создаются системным вызовом socket(), который возвращает файловый дескриптор для неинициализированного сокета. При создании сокет привязывается к определенному протоколу, однако соединение для сокета не устанавливается. На данном этапе

17.6.1. Создание UDP-сокета

17.6.1. Создание UDP-сокета Как и любой другой сокет, UDP-сокет создается с помощью функции socket(), однако второй аргумент должен быть SOCK_DGRAM, а последний — либо IPPROTO_UDP, либо просто ноль (так как UDP является стандартным IP-дейтаграммным протоколом).После создания сокета ему

11.9.3 Связывание

11.9.3 Связывание Сервер DHCP хранит таблицу соответствия между клиентами и их конфигурационными параметрами. Связывание заключается в назначении каждому клиенту IP-адреса и набора конфигурационных

R.3.3 Программа и связывание

R.3.3 Программа и связывание Программа состоит из одного или нескольких файлов, связываемых вместе (§R.2). Файл состоит из последовательности описаний. Имя с файловой областью видимости, которое явно описано как static, является локальным в своей единице трансляции и может

Читать еще:  Main php cmd share details

Динамическое связывание

Динамическое связывание Упрощенно говоря, динамическое связывание, или динамическая привязка, — это подход, с помощью которого можно создавать экземпляры заданного типа и вызывать их члены в среде выполнения и условиях, когда во время компиляции о типе еще ничего не

9.1.7. Безопасное связывание A

9.1.7. Безопасное связывание A При использовании перегрузки складывается впечатление, что в программе можно иметь несколько одноименных функций с разными списками параметров. Однако это лексическое удобство существует только на уровне исходного текста. В большинстве

4. Создание объектной модели и ее связывание с моделью данных при помощи ERwin Translation Wizard

4. Создание объектной модели и ее связывание с моделью данных при помощи ERwin Translation Wizard 4.1. Язык UML Классический структурный подход к созданию ИС предполагает последовательную реализацию этапов анализа, проектирования, создания модулей, объединения модулей в единую

Динамическое создание и повторное связывание

Динамическое создание и повторное связывание Что не было показано при описании структуры объектов периода выполнения, так это в высшей степени динамичная природа настоящей ОО-модели. Статическая и ориентированная на стеки политика управления объектами характерна для

Связывание с АТД

Связывание с АТД Класс, как неоднократно говорилось, является реализацией АТД, заданного формальной спецификацией или неявно подразумеваемого. В начале лекции отмечалось, что утверждения можно рассматривать, как способ введения в класс семантических свойств, лежащих в

Динамическое связывание

Динамическое связывание Динамическое связывание дополнит переопределение, полиморфизм и статическую типизацию, создавая базисную тетралогию

Типизация и связывание

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

Программирование сокетов на PHP (Sockets programming in PHP)

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

  1. Функция fsockopen(string hostname, integer port, integer error_number, string error_description, double timeout) — она открывает сетевое соединение как файловый поток и возвращает дискриптор файла с которым работают функции fputs, fgets и т.д.
  2. Функции которые передают информацию непосредственно на уровне IP-протокола. И это гораздо более низкий уровень по сравнению с уровнем на котором работает функция fsockopen.

Рассматриваться будут только функции под номером 2, т.к. они более интересны.
Для начала проверим, подключена ли у Вас библиотека работы с сокетами.

Проверить это можно следующим скриптом:

Если расширение не загружено, то Вам следует его загрузить.

И так. Наиболее простой в рамках статьи пример — echo-сервер. Эхо-сервер — это означает, что строка отправленная клиентом серверу, возвращается обратно. То есть сервер получает какое-то сообщение от клиента, что-то с ним делает и отправляет ему обратно.

У нас будет 2 скрипта:

Скрипт «Клиент».

Для реализации клиента нам понадобятся следующие функции работающие с сокетами:

  1. socket_create(integer family, integer socket_type, integer protocol); — функция создаёт сокет и возвращает ресурс сокета. Первым аргументом является семейство протокола, Если соединение будет через Internet, то задаваемое значение должно быть — AF_INET; Если соединение будет происходить через сокеты UNIX — AF_UNIX; Вторым аргументом является тип сокета. Обычно используются SOCK_STREAM для TCP взаимодействия и SOCK_DGRAM для UPD взаимодействия. Третий аргумент задаёт протокол SOL_TCP или SOL_UPD в зависимости от типа.
  2. socket_connect(resource socket, string address, integer port); — после создания сокета необходимо к нему подключится. Первым аргументом является ресурс созданного сокета, вторым IP адрес сокета если семейство протокола AF_INET, или pathname сокета Unix-домена если сокет из семейства AF_UNIX. Третьем агрументом является номер порта с которым должно быть установлено соединение.
  3. socket_read(resource socket, integer length, integer type); — функция считывает заданное в аргументе lenght количество байт из указанного сокета. По умолчанию чтение производится без учета управляющих символов, или можно задать в аргументе type — PHP_BINARY_READ, для учета управляющих символов необходимо задать значение PHP_NORMAL_READ.
  4. socket_write(resource socket, string buffer, integer length); — функция записывает данные в сокет.
  5. socket_close(resource socket); — закрывает сокет и освобождает память.

Листинг 1.0 — Клиент

Скрипт «Сервер».

Для реализации сервера нам понадобятся следующие функции работающие с сокетами:

  1. Все те функции которые были описаны выше.
  2. socket_bind(resource socket, string address, integer port); — функция привязывает адрес к сокету. Аргумент addres — IP адрес сокета если семейство протокола AF_INET, или pathname сокета Unix-домена если сокет из семейства AF_UNIX.
  3. socket_listen(resource socket, integer backlog) — функция прослушивает входящие соединения в сокет. Необязательный второй аргумент устанавливает максимальный размер очереди запросов, ожидающих соединения.
  4. socket_accept(resource socket); — После того как сокет создан, привязан, и начал прослушивание, именно эта функция делает сервер сервером. Функция принимает входящие соединения.

Листинг 1.1 — Сервер

Вот собственно и всё. Вначале запустите скрипт сервер, он создаст, привяжет, начнёт прослушивание сокета и установится в режим ожидания клиента. Далее запустите клиента.

Читать еще:  Matlab построение графиков по точкам

Так же хочу отметить что наиболее полезной является функция:
socket_select(array read, array write, array except, integer timeout_seconds, integer timeout_microseconds); — Функция контролирует изменения происходящие на узлах. PHP просматривает поступления новых дынных на сокетах, заданных в массиве read. PHP просматривает готовность к приёму данных на сокетах, заданных в массиве write. PHP просматривает на наличие ошибок потоки, заданные в аргументе except. В таймаутах задается время, по истечению которого функция будет возвращать кол-во сокетов изменивших своё состояние или FALSE.

Эта функция не заменима для мониторинга клиентов висящих на сокете.

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

PHP socket bind/listen не работают при использовании в методе (классе)

Я хотел реализовать простой механизм блокировки для нескольких заданий cron и решил сделать это необычным способом. Похоже, что PHP немного глючит, когда дело доходит до сокета create/bind/listen.

Код, который работает:

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

Если вы возьмете тот же код PHP и поместите его в простой класс, он не будет bind/listen. вот код, о котором я говорю:

Выполните этот код, и вы увидите, что var_dump скажет, что:

  1. $socket -это ресурс (то, что мы хотим)
  2. $bind = true
  3. $listen = true

но код на самом деле не binding/listening.

Что я делаю не так?

EDIT:

1 Ответ

Ответ прост: ваша переменная $socket является локальной переменной ,и она не имеет ссылок, а в области метода. Это означает, что после выполнения метода PHP уничтожит все локальные переменные — так же как и $socket . Т. е. вы создаете сокет успешно, а затем PHP отменяет его в тот же момент (потому что метод завершает его выполнение). Обратите внимание, что сброс локальных переменных не означает немедленного освобождения памяти. Циклы сбора мусора стоят дорого, поэтому PHP будет делать это только тогда, когда будет достигнут предел памяти.

Чтобы увидеть разницу, поместите вызов sleep() внутри метода после создания сокета. PHP имеет сбор мусора с версии 5.3, поэтому версии, которые вы пробовали, затронуты. Чтобы увидеть его в прямом эфире, вы можете проверить этот фрагмент :

— как вы можете видеть, деструктор класса был вызван немедленно после выхода из вызова метода, потому что локальная переменная $obj не имеет ссылок нигде больше.

Похожие вопросы:

В приложении C++ Linux я вызываю socket(), bind() и listen(), чтобы создать сокет сервера. Обычно, если приложение запускается дважды (с одним и тем же портом сервера), во втором процессе bind().

Я попробовал следующее: int sockfd = socket(. ); listen(sockfd, 10); accept(sockfd, . ); Ни один из вызовов не провалился, и программа просто начала блокироваться, как если бы я позвонил bind().

Я написал небольшой класс для управления соединениями сокетов в PHP: #/usr/bin/php new( Listen => 10, # What does this parameter do? LocalPort => 5000, Proto => ‘tcp’.

Я работаю с WinSock , и у меня есть одна проблема: если я определяю MY_IP как 127.0.0.1, это работает, но я не хочу этого, я хочу определить MY_IP как 109.95.202.122, но это не работает. У меня есть.

Пытаюсь запустить мой простой сервер FTP. Он работает на удаленном сервере. Использование cat /etc/*-release показывает, что сервер работает на ядре CentOS Linux 7. Ссылка.

Я писал простую программу сокета для сервера, где я получил зависание в вызове listen() . Удивительно, но этот кусок кода висит : if((res = listen(sockfd, 5)) == -1) < perror(Error in listening over.

Пытаюсь создать серверно-клиентское приложение, и у меня довольно много проблем с настройкой соединения на стороне сервера. После настройки сокета и bind() ing сокета, мой listen() -вызов.

У меня есть сценарий службы сервера и сценарий службы клиента, написанный в PHP, используя сокеты PHP API. Они отлично работают в localhost , но после загрузки этих двух сценариев в мою учетную.

Во всех примерах, включая руководство Beej , адрес IP предоставляется в точечной нотации, а затем он подается в ::getaddrinfo() . Этот пост не отвечает на мой вопрос. После чего структура addrinfo.

Сокеты: Сервер на PHP

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

Сразу привожу код сервера на PHP с подробными комментариями:

Данный код я постарался тщательно прокомментировать, поэтому, надеюсь, Вам в нём всё понятно. Главное понять следующее: сервер — это непрерывно выполняющийся скрипт, который просто ждёт подключения клиентов. Затем принимающий запрос и на основании этого запроса, возвращающий клиенту ответ. Это самое главное, что Вам необходимо понять.

А в следующей статье мы с Вами напишем клиента на PHP, который и будет подключаться к данному серверу и отправлять различные запросы.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Читать еще:  Matlab русский язык

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 14 ):

    У меня ошибка, пишет что функции socket_create нет.

    Надо включить эту библиотеку. Для этого в php.ini расскоментируйте строчку: extension=php_sockets.dll, затем перезапустите сервер.

    Надо включить эту библиотеку. Для этого в php.ini расскоментируйте строчку: extension=php_sockets.dll, затем перезапустите сервер. — Вот я всё по инструкции сделал,а оно мне:
    Fatal error: Call to undefined function socket_create() in Z:homelocalhostwwwserver.php on line 7

    Дополнительные модули к Денверу установите (скачайте их с http://denwer.ru).

    А что нужно именно скачать,можна ссылку ))

    Дополнительные модули нужно скачать: http://www.denwer.ru/packages/php5.html

    Ваш совет помог мне включить поддержку сокетов на денвере,спасибо!

    После установки дополнительных модулей ошибка сохранилась.

    Все отлично, но вот есть вопрос: здесь если мы получили коннект клиента, то пока он не перестанет слать что либо серверу(здесь пока не пошлет exit), другие клиенты будут как бы в очереди и не будут обрабатываться. Есть варианты одновременной обработки нескольких клиентов?

    Скажите хоть. Надо ли запускать самостоятельно «server.php» или его просто надо разместить и он сам будет непрерывно работать! Опишите пожалуйста, Может из за денвера моего не х..на не работает!?

    Надо запускать и сам он непрерывно работать не будет.

    «Главное понять следующее: сервер — это непрерывно выполняющийся скрипт» Зачем тогда вообще эти сокеты нужны? Где они используются?

    А как он запускается?

    Скажите пожалуйста, а как его запускать. этот сокет сервер на Денвере?

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    socket bind

    1 socket bind

    См. также в других словарях:

    Internet socket — In computer networking, an Internet socket or network socket is an endpoint of a bidirectional inter process communication flow across an Internet Protocol based computer network, such as the Internet. The term Internet sockets is also used as a… … Wikipedia

    Mobile VPN — Dieser Artikel wurde aufgrund von inhaltlichen Mängeln auf der Qualitätssicherungsseite der Redaktion Informatik eingetragen. Dies geschieht, um die Qualität der Artikel aus dem Themengebiet Informatik auf ein akzeptables Niveau zu bringen. Hilf… … Deutsch Wikipedia

    Berkeley sockets — The Berkeley sockets application programming interface (API) comprises a library for developing applications in the C programming language that perform inter process communication, most commonly across a computer network.Berkeley sockets (also… … Wikipedia

    Сокеты Беркли — Сокеты Беркли интерфейс программирования приложений (API), представляющий собой библиотеку для разработки приложений на языке Си с поддержкой межпроцессного взаимодействия (IPC), часто применяемый в компьютерных сетях. Сокеты Беркли (также… … Википедия

    Berkeley Sockets — Les Berkeley sockets, que l on pourrait traduire par « connecteurs réseau de Berkeley[1] », représentent une interface de programmation pour les communications entre processus Interprocess communication . Elles ont été introduites pour… … Wikipédia en Français

    Berkeley sockets — Les Berkeley sockets, que l on pourrait traduire par « connecteurs réseau de Berkeley[1] », représentent une interface de programmation pour les communications entre processus Interprocess communication . Elles ont été introduites pour… … Wikipédia en Français

    Prise (structure de données logicielle) — Berkeley sockets Les Berkeley sockets, que l on pourrait traduire par « connecteurs réseau de Berkeley[1] », représentent une interface de programmation pour les communications entre processus Interprocess communication . Elles ont été… … Wikipédia en Français

    Port number — In computer networking, a port is an application specific or process specific software construct serving as a communications endpoint in a computer s host operating system. A port is associated with an IP address of the host, as well as the type… … Wikipedia

    User Datagram Protocol — (UDP) is one of the core protocols of the Internet Protocol Suite. Using UDP, programs on networked computers can send short messages sometimes known as datagrams (using Datagram Sockets) to one another. UDP is sometimes called the Universal… … Wikipedia

    Ligament — A ligament is a tough band of connective tissue that connects various structures such as two bones. Ligament is a fitting term; it comes from the Latin ligare meaning to bind or tie. * * * 1. A band or sheet of fibrous tissue connecting two or… … Medical dictionary

    Computer network programming — In computing, network programming, essentially identical to socket programming or client–server programming, involves writing computer programs that communicate with other programs across a computer network. The program or process initiating the… … Wikipedia

    Ссылка на основную публикацию
    Adblock
    detector