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

Работа с socket_send: руководство и практика
Раздел: Сокеты
socket_send(resource socket, string buf, int len, int flags): int
Описание функции socket_send

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

Аргументы функции
  • $socket (Socket) – ресурс сокета, созданный с помощью socket_create.
  • $data (string) – данные для отправки.
  • $length (int) – количество байтов для отправки. Если $length больше длины $data, будет отправлен весь буфер.
  • $flags (int) – битовая маска флагов, комбинируемая с помощью оператора |. Возможные значения:
    • MSG_OOB – отправка данных out-of-band.
    • MSG_EOR – индикатор конца записи.
    • MSG_EOF – завершение передачи; отправка стороны закрывает сокет.
    • MSG_DONTROUTE – обход маршрутизатора, использовать прямой интерфейс.
Базовые примеры использования
Отправка простого сообщения
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8080);
$message = "Hello Server";
$sent = socket_send($socket, $message, strlen($message), 0);
echo "Отправлено байт: $sent";
socket_close($socket);
Отправлено байт: 12
Использование флага MSG_OOB
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8080);
$message = "Urgent Data";
$sent = socket_send($socket, $message, strlen($message), MSG_OOB);
echo "Срочные данные отправлены: $sent байт";
Срочные данные отправлены: 11 байт
Похожие функции в PHP
  • socket_write – записывает данные в сокет. Работает аналогично socket_send, но без поддержки флагов. Часто используется для простой отправки.
  • fwrite – записывает данные в поток, включая сокет, открытый с помощью stream_socket_client. Работает на более высоком уровне абстракции.
  • stream_socket_sendto – отправляет данные на сокет, используя контекст потоков. Поддерживает как подключенные, так и неподключенные сокеты.

socket_send предпочтительнее при необходимости использования специфических флагов или низкоуровневого контроля. Для обычной записи подойдет socket_write или fwrite.

Аналоги в других языках
Python: socket.send
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8080))
sent = s.send(b'Hello')
print(f'Sent: {sent} bytes')
Sent: 5 bytes
JavaScript (Node.js): socket.write
const net = require('net');
const client = net.createConnection({ port: 8080, host: '127.0.0.1' }, () => {
  const sent = client.write('Hello');
  console.log(`Sent data, buffer size: ${sent}`);
});
Sent data, buffer size: true
Отличия

В Python и Node.js функции отправки интегрированы в объект сокета и часто возвращают количество отправленных байт. В PHP требуется отдельный вызов socket_send для ресурса сокета с поддержкой дополнительных флагов.

Типичные ошибки
Неправильный сокет
$socket = null;
$sent = socket_send($socket, 'test', 4, 0);
if ($sent === false) {
    $error = socket_strerror(socket_last_error());
    echo "Ошибка: $error";
}
Ошибка: Неверный аргумент
Отправка на закрытый сокет
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8080);
socket_close($socket);
$sent = socket_send($socket, 'test', 4, 0);
if ($sent === false) {
    echo "Сокет закрыт, отправка невозможна";
}
Сокет закрыт, отправка невозможна
История изменений

В PHP 8.0 тип параметра $socket изменен с resource на Socket. В остальном поведение функции остается стабильным.

Расширенные примеры
Отправка бинарных данных
Пример php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 9000);
$binaryData = pack('C*', 0x48, 0x65, 0x6C, 0x6C, 0x6F); // "Hello" в бинарном виде
$sent = socket_send($socket, $binaryData, 5, 0);
echo "Отправлено бинарных байт: $sent";
Отправлено бинарных байт: 5
Комбинирование флагов
Пример php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8080);
$message = "Final message";
$sent = socket_send($socket, $message, strlen($message), MSG_EOR | MSG_EOF);
echo "Отправлено с флагами EOR и EOF: $sent байт";
// После этого сокет может быть закрыт отправляющей стороной.
Отправлено с флагами EOR и EOF: 13 байт
Постепенная отправка данных
Пример php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8080);
$data = str_repeat('A', 1024); // 1 КБ данных
$totalLength = strlen($data);
$offset = 0;
while ($offset < $totalLength) {
    $chunk = substr($data, $offset, 128); // Отправляем по 128 байт
    $sent = socket_send($socket, $chunk, strlen($chunk), 0);
    if ($sent === false) {
        echo "Ошибка отправки";
        break;
    }
    $offset += $sent;
    echo "Отправлено $sent байт, всего: $offset\n";
}
socket_close($socket);
Отправлено 128 байт, всего: 128
Отправлено 128 байт, всего: 256
...
Отправлено 128 байт, всего: 1024

PHP socket_send function comments

En
Socket send Sends data to a connected socket