Socket bind: примеры (PHP)
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).
Базовые примеры использования
$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
$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
Функция создает и привязывает сокет в одной операции. Упрощает код, но предоставляет меньше низкоуровневого контроля.
socket_bind используется при необходимости точного контроля над параметрами сокета. stream_socket_server подходит для быстрого создания серверных сокетов с использованием потоков.
Аналоги в других языках
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8080))
print("Сокет привязан")Сокет привязан
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. Основные улучшения касаются внутренней обработки ошибок и согласованности типов параметров. Добавлена строгая проверка типов для аргументов функции.
Расширенные примеры
$socket = socket_create(AF_INET6, SOCK_STREAM, SOL_TCP);
if (socket_bind($socket, '::1', 8080)) {
echo "IPv6 сокет привязан";
}
socket_close($socket);IPv6 сокет привязан
$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
$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