Unix 单进程崩溃后如何清理套接字?

Unix 单进程崩溃后如何清理套接字?,unix,mono,asyncsocket,Unix,Mono,Asyncsocket,我正在用mono创建一个聊天服务器,它应该能够打开许多套接字。在决定架构之前,我正在使用mono进行负载测试。为了进行测试,我创建了一个小型mono服务器和一个打开100000个套接字/连接的mono服务器,它工作得非常好 我试图达到极限,有时进程崩溃了(当然)。 但让我担心的是,如果我尝试重新启动进程,它会直接给出“未处理的异常:System.Net.Sockets.SocketException:打开的文件太多” 因此,我猜想即使进程结束,文件描述(套接字)也会保持打开状态。即使几个小时后它

我正在用mono创建一个聊天服务器,它应该能够打开许多套接字。在决定架构之前,我正在使用mono进行负载测试。为了进行测试,我创建了一个小型mono服务器和一个打开100000个套接字/连接的mono服务器,它工作得非常好

我试图达到极限,有时进程崩溃了(当然)。 但让我担心的是,如果我尝试重新启动进程,它会直接给出“未处理的异常:System.Net.Sockets.SocketException:打开的文件太多”

因此,我猜想即使进程结束,文件描述(套接字)也会保持打开状态。即使几个小时后它仍然会出现这个错误,我唯一能处理它的方法就是重新启动我的计算机。如果我们在生产过程中不知道如何处理,就不会遇到这种问题

我的问题: 在Mono中是否有任何东西可以保持全局运行,而不管启动哪个Mono应用程序,这是一种我可以在不重新启动计算机的情况下重新启动的服务? 或者这不是mono问题,而是unix问题,即使我们用java/C++编程,我们也会遇到这个问题

我检查了以下内容,但没有活动的mono进程,没有打开的套接字,也没有文件:

localhost:~ root# ps -ax | grep mono  
1536 ttys002    0:00.00 grep mono
-

-


对于开发,我在OSX 10.7.5下运行。对于生产,我们可以决定使用哪个平台。

听起来您需要在套接字上设置(或取消设置)Linger选项(使用)。根据您使用的实际API,可能有更好的替代方案(例如,TcpClient有一个属性)

localhost:~ root# lsof | grep mono  
(nothing)
localhost:~ root# netstat -a  
Active Internet connections (including servers)  
(no unusual ports are open)