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

时间:2013-02-20 00:47:38

标签: unix mono asyncsocket

我正在创建一个单声道的聊天服务器,应该可以打开很多套接字。在决定架构之前,我正在使用mono进行负载测试。仅仅为了测试,我创建了一个小型单服务器和单服务器,可以打开100,000个套接字/连接,并且运行良好。

我试图达到极限,但在某个时候进程崩溃(当然)。 但令我担心的是,如果我尝试重新启动进程,它会直接给出“Unhandled Exception:System.Net.Sockets.SocketException:Too many open files”。

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

我的问题: 无论启动哪个单声道应用程序,Mono中是否存在全局运行的任何内容,我可以在不重新启动计算机的情况下重启一种服务? 或者这不是单声道问题,而是unix问题,即使我们用java / C ++编程也会遇到问题?

我检查了以下内容,但没有单个进程处于活动状态,没有套接字打开且没有文件:

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

-

localhost:~ root# lsof | grep mono  
(nothing)

-

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

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

1 个答案:

答案 0 :(得分:0)

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