Unauthentifizierte Verbindungen Schließen
Problem:
Wie können Verbindungen von Clients, die innerhalb eines festgelegten Zeitrahmens keine Daten gesendet haben, geschlossen werden?
Zum Beispiel soll die Verbindung zu einem Client, der innerhalb von 30 Sekunden keine Daten sendet, automatisch geschlossen werden.
Das Ziel ist es, sicherzustellen, dass unauthentifizierte Verbindungen innerhalb eines bestimmten Zeitrahmens authentifiziert werden.
Antwort:
use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('xxx://x.x.x.x:x');
$worker->onConnect = function(TcpConnection $connection)
{
// Temporär das auth_timer_id Attribut zum $connection Objekt hinzufügen, um die Timer-ID zu speichern.
// Timer auf 30 Sekunden setzen, um die Verbindung zu schließen.
// Der Client muss innerhalb von 30 Sekunden eine Validierung senden, um den Timer zu löschen.
$connection->auth_timer_id = Timer::add(30, function()use($connection){
$connection->close();
}, null, false);
};
$worker->onMessage = function(TcpConnection $connection, $msg)
{
$msg = json_decode($msg, true);
switch($msg['type'])
{
case 'login':
...略
// Bei erfolgreicher Validierung den Timer löschen, um zu verhindern, dass die Verbindung geschlossen wird.
Timer::del($connection->auth_timer_id);
break;
... 略
}
... 略
}