J'essaie d'effectuer une opération d'envoi/réception de socket TCP relativement basique sur Windows CE à l'aide de .NET Compact Framework. J'essaie de définir la valeur du délai d'attente afin que les lectures/écritures sur un délai d'attente de connexion lente au lieu de bloquer pour toujours. Sur la structure complète, je suis en mesure de simplement définir les propriétés ReceiveTimeout
et SendTimeout
sur l'objet Socket
. Malheureusement, la définition de ces propriétés sur l'infrastructure compacte entraîne immédiatement une exception SocketException à propos de l'utilisation d'une option de socket non prise en charge.Gérer correctement les délais d'attente réseau sous Windows CE
Après avoir creusé un peu plus loin, je suis tombé sur la page this qui dit ce qui suit:
The following table shows BSD options not supported for setsockopt: Value Type Description SO_ACCEPTCONN BOOL Sets socket listening. SO_RCVLOWAT int Sets recv low watermark. SO_RCVTIMEO int Sets time-out for recv. SO_SNDLOWAT int Sets send low watermark. SO_SNDTIMEO int Sets time-out value for send. SO_TYPE int Sets socket type.
Il ne ressemble pas à Windows CE prend en charge les délais d'attente. Un délai d'attente finira par se produire sur une connexion qui ne répond pas, mais il semble prendre environ une minute (doit être codé en dur quelque part dans WinCE). Alors maintenant, j'essaie de comprendre comment l'implémenter manuellement. Ma première pensée est d'utiliser des E/S asynchrones qui me permettent de WaitOne(timeout)
. Cependant, cela n'arrêtera pas le thread asynchrone qui sera bloqué sur EndSend()
ou EndReceive()
. Donc, même si je peux temporiser mon thread principal, il y aura toujours des threads qui traînent jusqu'à ce que le timeout codé en dur soit atteint. Pendant ce temps mon application ne s'arrêtera pas correctement. La seule façon dont je peux penser à contourner ce problème serait d'abandonner le thread asynchrone mais cela semble être une très mauvaise idée et j'aimerais l'éviter.
Alors, quelle est la bonne façon de gérer cela? Il doit y avoir un moyen simple car d'autres applications (par exemple IE sur WinCE) ne semblent pas avoir de problème pour temporiser ou annuler les opérations réseau en attente et elles semblent pouvoir s'arrêter sans problème.
Pourriez-vous s'il vous plaît partager l'exemple de code? –
Solution soignée, mais je suppose que vous n'avez pas résolu le problème de délai d'attente dans Windows CE? Lorsque j'essaie cela sur Windows CE 6.0, je reçois un délai d'attente après ~ 20s et je n'ai pas été en mesure de modifier cela. Voir par exemple: https://stackoverflow.com/questions/44566777/tweak-timeout-period-for-socket-connections-on-windows-ce – AlainD