Socket bind: примеры (PHP)

Привязка сокетов: работа с socket_bind
Раздел: Сокеты
socket_bind(resource socket, string address [, int port]): bool

Основные сведения о socket_bind

Описание функции

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

Аргументы функции
  • socket (обязательный) - ресурс сокета, созданный функцией socket_create.
  • address (обязательный) - IP-адрес для привязки. Для сервера можно использовать конкретный адрес или 0.0.0.0 для привязки ко всем интерфейсам.
  • port (необязательный) - номер порта для привязки. Для клиентских сокетов обычно не указывается (или указывается 0).

Базовые примеры использования

Привязка TCP-сокета
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "Ошибка создания сокета: " . socket_strerror(socket_last_error());
}

$result = socket_bind($socket, '127.0.0.1', 8080);
if ($result === false) {
    echo "Ошибка привязки: " . socket_strerror(socket_last_error($socket));
} else {
    echo "Сокет успешно привязан к 127.0.0.1:8080";
}
socket_close($socket);
Сокет успешно привязан к 127.0.0.1:8080
Привязка UDP-сокета
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
$result = socket_bind($socket, '0.0.0.0', 9090);
echo $result ? "UDP сокет привязан ко всем интерфейсам на порту 9090" : "Ошибка";
UDP сокет привязан ко всем интерфейсам на порту 9090

Похожие функции в PHP

stream_socket_server

Функция создает и привязывает сокет в одной операции. Упрощает код, но предоставляет меньше низкоуровневого контроля.

Выбор между функциями

socket_bind используется при необходимости точного контроля над параметрами сокета. stream_socket_server подходит для быстрого создания серверных сокетов с использованием потоков.

Аналоги в других языках

Python: socket.bind()
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8080))
print("Сокет привязан")
Сокет привязан
JavaScript (Node.js): server.listen()
const net = require('net');
const server = net.createServer();
server.listen(8080, '127.0.0.1', () => {
    console.log('Сервер слушает порт 8080');
});
Сервер слушает порт 8080

Типичные ошибки

Попытка привязки к занятому порту
$socket1 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket1, '127.0.0.1', 9000);

$socket2 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_bind($socket2, '127.0.0.1', 9000);
if (!$result) {
    echo "Ошибка: " . socket_strerror(socket_last_error($socket2));
}
Ошибка: Address already in use
Недостаточные права для порта
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_bind($socket, '127.0.0.1', 80);
if (!$result) {
    echo "Ошибка: " . socket_strerror(socket_last_error($socket));
}
Ошибка: Permission denied

Изменения в PHP 8

В PHP 8 функция socket_bind не претерпела значительных изменений по сравнению с PHP 7. Основные улучшения касаются внутренней обработки ошибок и согласованности типов параметров. Добавлена строгая проверка типов для аргументов функции.

Расширенные примеры

Привязка IPv6 сокета
Пример php
$socket = socket_create(AF_INET6, SOCK_STREAM, SOL_TCP);
if (socket_bind($socket, '::1', 8080)) {
    echo "IPv6 сокет привязан";
}
socket_close($socket);
IPv6 сокет привязан
Мультиинтерфейсный сервер
Пример php
$interfaces = ['127.0.0.1', '192.168.1.100'];
$port = 8080;

foreach ($interfaces as $interface) {
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
    
    if (socket_bind($socket, $interface, $port)) {
        echo "Сокет привязан к $interface:$port\n";
        socket_listen($socket);
        // Сохранение сокета для дальнейшего использования
        $sockets[] = $socket;
    } else {
        echo "Ошибка привязки к $interface: " . socket_strerror(socket_last_error($socket)) . "\n";
        socket_close($socket);
    }
}
Сокет привязан к 127.0.0.1:8080
Сокет привязан к 192.168.1.100:8080
Автоматический выбор порта
Пример php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (socket_bind($socket, '127.0.0.1', 0)) {
    socket_getsockname($socket, $address, $port);
    echo "Сокет привязан к порту: $port";
}
Сокет привязан к порту: 54132

PHP socket_bind function comments

En
Socket bind Binds a name to a socket