On est bien d'accord: on parle d'un temps pour traverser la stack qui est totalement négligeable ; la granularité de l'ordonnanceur pour un OS non temps-réel (ce qui me semble être ton cas puisque tu parles de 'DLL') anihilera toute différence, de même que tout code dans ton développement un poil moins optimisé que ce qui aurait pu l'être.
Donc l'UDP n'aidera en rien ici à 'gagner du temps'. C'est ce que je voulais souligner, car ce genre de mythe "TCP est plus lent qu'UDP" (dans le sens SENSIBLEMENT plus lent) est un mythe qui a malheureusement la vie (trop) dure sur le web.
On parle évidemment d'une connexion déjà établie, donc une comparaison dans le cadre d'un fonctionnement 'normal' de chacun des protocoles (ie. tels qu'ils ont été prévus). Et dans ce cas là, la différence est nulle.
+10. Au mieux, tu pourras détecter au moyen de fonction bas niveau (non relatives au sockets) la perte de connexion sur le premier lien entre ton ordi et l'équipement suivant (switch, ...). En aucun cas, tu ne pourras 'monitorer' le serveur à l'autre bout de la connexion.
Les deux seules solutions sont:
- soit le programme du serveur qui envoie un ACK à chaque donnée reçue
- soit un mécanisme de 'keepalive' implémenté avec une fréquence bien supérieure aux 'standards' (genre 200ms au lieu des 30s habituelles).
Je ne vois pas en quoi jouer sur le buffer d'émission changera quoi que ce soit, à moins que les quantités de données soient telles que la liaison ne supporte plus la charge.
La bonne solution me semble être la désactivation de l'algo de Nagle sur la socket qui générera un paquet à chaque appel 'write' sur ta socket.
L'idéal serait d'avoir plus de données sur les contraintes imposées. Mais si on se réfère à ce que j'ai pu glaner:
- on a un réseau filaire local (supposons du 100Mbits)
- on a une quantité de données 'raisonnable' puisqu'aucun souci de débit n'a été mentionné
- on veut un temps d'exécution de 100ms maximum de la fonction de la DLL.
- on préfère faire du synchrone pour l'appel de la fonction de la DLL (elle retourne le résultat de l'envoi).
Dans ce cas là, les contraintes ne sont finalement pas bien fortes. On peut surtout compter sur une latence très faible d'une réseau Ethernet uniquement filaire (moins de 5ms de RTT).
Donc on a 20 fois plus de temps (100ms / 5ms) que le temps 'réseau' nécessaire pour envoyer un paquet et recevoir une sorte d'ACK que le serveur émterrait à chaque réception de paquet.
En d'autres termes, ça veut dire que même si on a une perte de paquet de temps en temps (voir même 10 de fois de suite, ce qui n'arrivera jamais), la marge est bien assez large pour laisser le temps à la couche TCP de renvoyer le paquet perdu et attendre un message d'ACK (de niveau applicatif au sens OSI) du serveur.
Donc le plus simple me semble de ne pas s'encombrer outre mesure:
- une connexion en TCP, algo de Nagle désactivé (important)
- on établit une fois pour toutes la connexion avec le serveur au départ.
- chaque fois qu'on veut envoyer une donnée, on utilie le canal TCP; à la réception de la donnée, le serveur envoie à son tour un message d'ACK.
- dès le ACK reçu côté client, la DLL retourne le résultat.
- on implémente un timeout de 100ms. Passé le délais, la DLL retourne une erreur 'serveur indisponible ou réseau surchargé (ou liaison de daube)'.
Ca prendra 15 minutes à implémenter et ça couvrira l'ensemble des contraintes énumérées. Pas besoin de vouloir s'ennuyer à faire quoi que ce soit de plus complexe amha.
Partager