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