2015-12-15 1 views
1

Je travaille avec une bibliothèque de nœuds qui ne ferme pas explicitement les sockets une fois qu'ils sont terminés. Au lieu de cela, il essaie de nettoyer en supprimant la référence à la socket et en les laissant être récupérées. Googling échoue: je ne pense pas que ce soit possible pour le GC de nettoyer les douilles non fermées. C'est-à-dire, je pense que tous les descripteurs de socket seront toujours utilisés, du point de vue de l'OS.Sockets de collecte des ordures dans Node.JS

De plus, en supposant que je, en tant que consommateur de la bibliothèque, ai accès aux objets socket, quelle est la meilleure façon de les fermer? J'ai joué avec end(), close(), et destroy() avec un succès limité. Parfois, ils semblent bloquer à perpétuité (fin/détruire), et d'autres fois, il semble que le rappel n'est jamais fait (fermer).

Répondre

1

Cela peut être dû au fait que votre socket a envoyé un paquet FIN et raccroche sur la connexion en attendant que l'autre extrémité envoie le message FIN2. Dans le cas où la prise de l'autre côté n'est pas bien fermée, votre appareil ne recevra aucun colis et restera ainsi suspendu pour toujours.
En fait, endsends a FIN packet et ne ferme pas le socket.

Une solution possible pourrait être de wait for a while on it au moyen de setTimeout lorsque vous invoquez la fonction end, puis explicitly destroy it au moyen de la fonction destroy. Cela n'affectera pas votre socket si l'autre extrémité a correctement fermé la connexion, sinon cela forcera l'arrêt et toutes les ressources devraient être libérées.