2011-05-01 5 views
2

J'ai un site de chat (http://www.pitput.com) qui connecte l'utilisateur via des connexions socket. J'ai du côté client un objet flash qui ouvre une connexion à un port de mon serveur. Dans le serveur j'ai un service qui écoute ce port dans un problème asynchrone. Tout fonctionne correctement, sauf quand je parle à quelqu'un après une période inconnue (environ quelques minutes) le serveur ferme ma connexion et j'obtiens une erreur dans le serveur: "Une tentative de connexion a échoué parce que le connecté la partie n'a pas répondu correctement après un certain temps, ou la connexion établie a échoué car l'hôte connecté n'a pas répondu ".Tcp socket fermant brusquement la connexion

Je ne sais pas exactement comment le socket tcp fonctionne. vérifie-t-il la connexion "en direct" toutes les deux secondes? comment décide-t-il quand fermer la connexion? Je suis assez sûr que l'opération ne vient pas du côté client.

Merci.

+0

Est-ce que cela se produit chaque fois que vous faites une pause de quelques minutes, ou juste parfois? –

Répondre

0

S'agit-il d'un service Web ASP hébergé par une entreprise? Si c'est le cas, le serveur recycle généralement les applications toutes les 10 à 20 minutes. Vous ne pouvez pas avoir un service Web en cours d'exécution indéfiniment, sauf si c'est votre propre serveur (je crois).

1

Il semble que le serveur gère la connexion mais ne répond pas. C'est le point où je tire habituellement WireShark pour savoir ce qui se passe.

1

TCP/IP dispose d'une option pour vérifier les connexions actives; ça s'appelle "keepalive". Keepalives sont rarement utilisés. Ils ne sont pas activés par défaut. Ils peuvent être activés à l'échelle du système en modifiant le registre, mais l'IIRC le délai le plus bas est de 1 heure. Ils peuvent également être activés sur une seule socket (avec un délai d'expiration en minutes), mais vous saurez si votre application le fait.

Si vous utilisez un service Web et que votre client se connecte à un port HTTP/HTTPS, il se peut qu'il soit fermé par le serveur HTTP (qui ferme généralement ses connexions après quelques minutes d'inactivité). Il est également possible qu'un routeur intermédiaire le ferme en votre nom après un certain temps d'inactivité (ce n'est pas le comportement par défaut, mais les routeurs d'entreprise sont parfois configurés avec de tels paramètres "utiles"). Si vous utilisez un service Win32, il semble en fait que le client abandonne la connexion ou perd son réseau (par exemple, se déplacer hors de portée d'un routeur sans fil). Dans ce dernier cas, il est possible que le client reste inconscient du fait que la connexion a été fermée (cette situation est appelée "half-open"); le serveur voit la fin mais le client pense que la connexion est toujours là.