2009-05-18 8 views
3

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.

Répondre

2

J'ai trouvé un moyen propre de faire cela. Fondamentalement, je fais l'envoi et la réception dans un thread séparé, puis en attente d'un événement (manuel ou l'événement de réinitialisation automatique devrait fonctionner). Si les temps d'attente sortent alors la simple fermeture (ou élimination) du socket annulera le blocage de la lecture/écriture dans l'autre thread provoquant un gracieux (une exception est levée sur l'exit Send()/Receive()). Espérons que cela sera utile à quelqu'un d'autre ...

+0

Pourriez-vous s'il vous plaît partager l'exemple de code? –

+0

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

Questions connexes