我正在使用一个Node库,它在完成后不会显式关闭套接字。相反,它试图通过删除对套接字的引用并让它们被垃圾收集来清理。
谷歌搜索让我失望:我不认为GC可以清理未关闭的套接字。也就是说,从操作系统的角度来看,我认为任何套接字描述符仍将被使用。
另外,假设我作为库使用者可以访问套接字对象,关闭它们的最佳方法是什么?我使用了end()
,close()
和destroy()
并取得了有限的成功。有时他们似乎会陷入永久性(结束/毁灭),有时似乎回调永远不会发生(接近)。
答案 0 :(得分:1)
这可能是因为您的套接字发送了FIN包并挂起连接,同时等待另一端发送FIN2消息。如果另一侧的插座没有很好地关闭,那么您的插座将不会收到任何包装,因此会永远挂起
实际上,end
sends a FIN packet并没有关闭套接字。
当您调用setTimeout
函数时,可以通过end
通过wait for a while on it获得explicitly destroy it,然后{{3}}通过函数destroy
。如果另一端已正确关闭连接,这不会影响您的套接字,否则会强制关闭并释放所有资源。