Je me demandais si quelqu'un sait comment contourner l'encodage de IO::Socket::Async, en particulier les inconvénients décrits par ceci:
Par exemple, si l'encodage UTF-8 est utilisé et que le dernier octet du paquet décodé est "a", cela ne sera pas émis car le prochain paquet peut inclure un caractère de combinaison qui devrait former un seul graphème ensemble. Les caractères de contrôle (comme \n) servent toujours de limites de graphèmes, donc tout protocole basé sur du texte qui utilise des retours à la ligne ou des octets nuls comme terminaux n'auront pas besoin d'une considération spéciale.
Cela cause actuellement que mes sockets omettent le dernier caractère des messages, mais je ne sais pas comment contourner cela. J'ai essayé de convertir la Connection
en un Channel
puis juste d'envoyer un pseudo \n
dedans, simulant la fin de l'entrée pour le message, mais cela n'a pas fonctionné. Comment puis-je contourner cette bizarrerie dans l'encodage UTF-8?
Voici le MVP pour reproduire ceci:
sub listen(Int $port) {
react {
whenever IO::Socket::Async.listen('0.0.0.0', $port) -> $connection {
whenever $connection.Supply -> $data {
say $data;
$connection.print: $data;
}
}
}
}
listen(9999);
Maintenant, si vous accédez au port 9999 sur votre machine locale avec des données qui ne se terminent pas par \n
, vous verrez que le dernier octet est ignoré.