Azurre
@Azurre
Web Developer

Reactphp socket server обрезает сообщения?

Использую Reactphp для обмена данными между cli приложениями. Столкнулся с проблемой, обрезания сообщения при приеме сообщений. Причем первое сообщение проходит нормально, а остальные - режутся. Грешил, на bufferSize, но увеличение буфера ни к чему не привело.

Отправка:
$client = stream_socket_client("tcp://{$this->host}:{$this->port}");
$conn = new \React\Stream\Stream($client, $loop);
$conn->bufferSize = 4194304;
....
$conn->write($data);

$data - json строка

Прием:
$socket = new \React\Socket\Server( $this->Loop );
$socket->on('connection', function ( Connection $Connection) {
    $Connection->bufferSize = 4194304;
    $Connection->on('data', function ($message) use ($Connection) {
            // ....
    });
});


На приеме $message уже обрезанный.
Подскажите, как решить проблему с обрезанием или хотя бы посоветуйте в какую сторону копать?
  • Вопрос задан
  • 388 просмотров
Решения вопроса 1
Azurre
@Azurre Автор вопроса
Web Developer
Проблема с stream_socket_recvfrom. На больших пакетах параметр length функцией нагло игнорируется и читает по 8192 байт (хотя иногда проскакивает и больше). Как это побороть нормально - не понятно, пока спасает костыль с несколькими проходами:

$retry = 8;
$emptyCountLimit = 4;
$emptyCount = 0;
$data = '';
do {
    $rcv = stream_socket_recvfrom($stream, $this->bufferSize);
    //  echo "[+] Read ". strlen($rcv).' bytes. Total: '.strlen($data).PHP_EOL;
    if ($rcv === '' || $rcv === false) {
        $emptyCount++;
        if ($emptyCount >= $emptyCountLimit) break;
        continue;
    }
    $emptyCount = 0;
    $data .= $rcv;
} while($retry--);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы