Socket create: примеры (PHP)
socket_create(int domain, int type, int protocol): resource|falseФункция socket_create создает новый сокет - конечную точку для сетевого взаимодействия. Она используется для реализации низкоуровневых сетевых соединений, когда стандартных протоколов или библиотек недостаточно.
Функция применяется в случаях:
- Разработки пользовательских сетевых протоколов
- Создания серверов для специфичных задач
- Реализации клиентов для нестандартных сервисов
- Мультиплексирования нескольких соединений
Аргументы функции:
- domain - домен сокета. Возможные значения: AF_INET (IPv4), AF_INET6 (IPv6), AF_UNIX (локальные сокеты)
- type - тип сокета. Основные значения: SOCK_STREAM (TCP), SOCK_DGRAM (UDP), SOCK_RAW (сырые сокеты)
- protocol - протокол. Обычно SOL_TCP для TCP или SOL_UDP для UDP, либо 0 для автоматического выбора
Функция возвращает ресурс сокета или false в случае ошибки.
// TCP сокет для IPv4
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "Ошибка: " . socket_strerror(socket_last_error());
} else {
echo "TCP сокет создан успешно";
}TCP сокет создан успешно
// UDP сокет для IPv6
$socket = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
echo "Ошибка создания UDP сокета: " . socket_strerror(socket_last_error());
} else {
echo "UDP IPv6 сокет создан";
socket_close($socket);
}UDP IPv6 сокет создан
// Локальный UNIX сокет
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
if ($socket === false) {
echo "Ошибка UNIX сокета: " . socket_strerror(socket_last_error());
} else {
echo "UNIX сокет создан";
}UNIX сокет создан
Для сетевого взаимодействия в PHP доступны несколько альтернатив:
Создает серверный сокет через потоковый API. Проще в использовании, поддерживает SSL, но менее гибкая.
Открывает соединение через файловый поток. Удобна для простых клиентских подключений, но не подходит для серверов.
Библиотека для сложных HTTP-запросов. Поддерживает множество протоколов и опций.
socket_create предпочтительнее при реализации пользовательских протоколов или когда требуется полный контроль над сокетом.
Socket create в Python
import socket
# Создание TCP сокета
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(type(sock))<class 'socket.socket'>
const net = require('net');
// Создание TCP сервера
const server = net.createServer();
console.log(typeof server);object
Socket create в Java
import java.net.Socket;
// Создание сокета
Socket socket = new Socket();
System.out.println(socket.getClass());class java.net.Socket
Основное отличие PHP реализации - ресурсный тип возвращаемого значения и процедурный стиль работы в большинстве примеров.
// Неправильный тип сокета
$socket = socket_create(AF_INET, 9999, SOL_TCP);
if ($socket === false) {
echo "Код ошибки: " . socket_last_error();
echo " Текст: " . socket_strerror(socket_last_error());
}Код ошибки: 10047 Текст: Address family not supported by protocol
// Создание RAW сокета требует прав администратора
$socket = socket_create(AF_INET, SOCK_RAW, getprotobyname('icmp'));
if ($socket === false) {
echo "Ошибка: " . socket_strerror(socket_last_error());
}Ошибка: Permission denied
// UNIX сокет с TCP протоколом
$socket = socket_create(AF_UNIX, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "Ошибка совместимости: " . socket_strerror(socket_last_error());
}Ошибка совместимости: Protocol not supported
В PHP 8.0 функция socket create не претерпела значительных изменений. Однако стоит отметить:
- PHP 8.0 улучшила обработку ошибок для функций сокетов
- Добавлена строгая типизация параметров
- Улучшена совместимость с IPv6
- В PHP 8.1 улучшена работа с ресурсами
Сигнатура функции осталась неизменной: socket_create(int $domain, int $type, int $protocol): Socket|false
// Создание нескольких сокетов
$sockets = [];
for ($i = 0; $i < 3; $i++) {
$sockets[$i] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($sockets[$i]);
}
// Проверка готовности сокетов
$read = $sockets;
$write = $except = null;
$changed = socket_select($read, $write, $except, 0);
echo "Готовых сокетов: $changed";
foreach ($sockets as $socket) {
socket_close($socket);
}Готовых сокетов: 0
// Неблокирующий TCP сокет
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket) {
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_set_nonblock($socket);
if (socket_bind($socket, '127.0.0.1', 0)) {
socket_getsockname($socket, $addr, $port);
echo "Сокет привязан к $addr:$port в неблокирующем режиме";
}
socket_close($socket);
}Сокет привязан к 127.0.0.1:45872 в неблокирующем режиме
// UDP сокет с поддержкой broadcast
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket) {
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
// Отправка широковещательного сообщения
$message = "Broadcast test";
$sent = socket_sendto($socket, $message, strlen($message), 0, '255.255.255.255', 12345);
echo "Отправлено broadcast сообщений: $sent байт";
socket_close($socket);
}Отправлено broadcast сообщений: 13 байт
// TCP сокет с настройкой таймаутов
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket) {
// Таймаут на чтение - 5 секунд
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ["sec" => 5, "usec" => 0]);
// Таймаут на запись - 3 секунды
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ["sec" => 3, "usec" => 0]);
echo "Сокет создан с таймаутами: 5с на чтение, 3с на запись";
socket_close($socket);
}Сокет создан с таймаутами: 5с на чтение, 3с на запись