
Ces dernières semaines, j'ai travaillé à rendre les écritures sockets non bloquantes
dans FreeRDP. Ceci m'a permis de faire une petite balade dans les composants bas-niveau de
FreeRDP, je vous propose donc un petit carnet de voyage.
Rendre les écritures non bloquantes
De quoi s'agit-il ?
Dans FreeRDP actuellement, les appels en lecture sont bien gérés de manière non-bloquante:
on s'attend a des résultats EAGAIN ou EWOULDBLOCK lors des lectures / écritures.
Par contre pour l'écriture, quand on a ce genre de résultats, on rentre dans une boucle qui va attendre
de manière active que les octets aient bien été envoyés. On est donc bloquant pour l'écriture
même si la socket est en mode non-bloquant.
On ne rencontre quasiment jamais ce cas en utilisant le client FreeRDP car la majorité du trafic va du serveur vers le
client. On imagine difficilement une saturation de la bande passante à coups de frappes
clavier ou de mouvements de souris. On peut néanmoins voir ça en utilisant des channels:
par exemple la redirection de disques (en poussant un fichier vers le serveur) ou la
redirection audio du micro (le micro local exporté sur le serveur).
Par contre quand on est dans FreeRDS, en tant que serveur RDP, c'est un cas que l'on
rencontre très fréquemment. Il suffit de regarder une vidéo youtube en fullscreen à travers un réseau
WIFI moyen (le mien pour ne pas le nommer), et on tombe tout de suite dans le cas en question. Et
ceci malgrés la compression remoteFx.
Lire la suite…