La solution est pourtant bien simple: tu ne dois pas "attendre". Tu dois traiter ce que tu as déjà reçu. Le reste (timeout, etc...) viendra naturellement et sans perturber le fonctionnement normal du serveur (qui n'est rien d'autre que "écouter" et "traiter" mais jamais "attendre").
Tu écoutes en perma ton socket et tu mets au fur et à mesure que tu reçois tes données dans une liste FIFO thread-safe.
De l'autre côté, tu vas piocher dans ce FIFO:
- Tu traites les données qui peuvent être traitées directement.
- Si les données sont incomplètes, tu les mets dans une autre liste (voir même liste de liste).
- Si jamais une liste de données incomplètes se complète, tu la traite.
- Si la dernière mise à jour d'une liste date de plus longtemps que ton timeout, tu supprimes cette liste sans la traiter (ou tu préviens le client que son packet a time out, ou qu'il est incorrect, ou qu'il est pas gentil de ne pas te raconter la suite de l'histoire).
Il n'y a aucune perturbation, tu n'attends rien de spécial, si ce n'est que des données (n'importe lesquels, tu t'en fous): tu traites les choses au fur et à mesure de ce que tu peux.
Le fonctionnement de ton serveur ne doit surtout pas dépendre de ce qu'envoit le client. En réalité, peu importe ce qu'on t'envoi, le serveur ne doit jamais s'attendre à recevoir de nouveaux trucs voir pire "bloquer jusqu'à ce qu'il recoive ce qu'il s'attend à recevoir".
Le serveur doit juste "écouter" et "traiter ce qu'il peut". Il ne doit jamais se trouver dans une situation "attend attend j'ai pas eu la fin, il va bien me l'envoyer un jour, j'attend !"
D'ailleurs la même chose s'applique du côté client, mais à moindre mesure (dans le sens où si un client plante, le serveur s'en fout, mais si le serveur plante, le client est un peu dans la merde)
Partager