Сокет-сервер пропускает сообщения

117
19 декабря 2019, 12:30

имеется сервер. Возникает проблема, иногда клиент отправляет несколько сообщений подряд и сервер не успевает их поймать, как можно исправить? Например, клиент отправляет число 32, затем 58. Но сервер получает только 32.

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
$address = 'localhost'; //Адрес работы сервера
$port = 7777;
socket_bind($socket, $address, $port);
socket_listen($socket);
socket_set_nonblock($socket); // отключает блокирование при чтении сокета
$clients[] = $socket;
$members = array();
echo "\n\n\n";
while(true){
    sleep(1);
    $read = $clients;
    if(socket_select($read, $write = NULL, $except = NULL, 0) < 1)
    {
        echo '.';
        continue;
    }
    echo "\n---------------------\n";
    //print_r($read); echo "\n";
    //print_r($clients); echo "\n";

    if(in_array($socket, $read))
    {
        $new_socket = socket_accept($socket);
        socket_getpeername($new_socket, $client_ip);
        // Шаг 1. отдать полиси
        if(!$members[$client_ip])
        {
            $members[$client_ip] = 'new';
            $data = socket_read($new_socket, 1024, PHP_BINARY_READ);
            if(trim($data) == '<policy-file-request/>')
            {
                echo "send policy...\n";
                $msg = "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"7777\" /></cross-domain-policy>\0"; // Crossdomain
                socket_write($new_socket, $msg, strlen($msg));
                socket_close($new_socket);
            }
        } elseif($members[$client_ip] == 'new') { // Шаг 2. добавить пользователя в список подключенных
            $clients[] = $new_socket;
            $members[$client_ip] = 'client';
            echo "+ New client: $client_ip, all: ".(count($clients) - 1)."\n";
            //print_r($clients); echo "\n";
        }
        unset($read[array_search($socket, $read)]);
    }
    //print_r($read); echo "\n";
    foreach($read as $v)
    {
        $data = socket_read($v, 2048, PHP_BINARY_READ);
        // Если клиент послал сообщение
        if($data)
        {
            echo "Data ".$code."\n";
        } elseif(!trim($data)) { // Если клиент отключился
            socket_getpeername($v, $client_ip);
            unset($members[$client_ip]);
            unset($clients[array_search($v, $clients)]);
            socket_close($v);
            echo "< ".$client_ip.": client disconnected. All: ".(count($clients) - 1)."\n";
        }
    }
}
    // Закрыть сокет
    socket_close($socket);
    ?>
READ ALSO
Количество ФИЗИЧЕСКИХ процессоров на Linux c/c++

Количество ФИЗИЧЕСКИХ процессоров на Linux c/c++

Не понимаю , как написать код на c/c++ для определения количества ФИЗИЧЕСКИХ процессоров (не ядер)Может можно как-то интерпретировать команды...

131
Pedis от SEASTAR

Pedis от SEASTAR

Случайно наткнулся на интересный репозиторий, где показывают аналог Redis, который называется Pedishttps://github

152
Зачем нам нужны синглтоны в С++?

Зачем нам нужны синглтоны в С++?

Когда-то давно (лет 7 назад) читал я АлександрескуИ обратил внимание, что он много места уделял созданию синглтонов

165