2013-02-20 28 views
1

我正在创建一个单声道聊天服务器,应该可以打开多个套接字。在决定架构之前,我正在用单声道进行负载测试。为了测试,我创建了一个小型单服务器和单服务器,可以打开100,000个套接字/连接,并且工作得非常好。单进程崩溃后如何清理套接字?

我试图达到极限,并在某个过程崩溃(当然)。 但是,我担心的是,如果我尝试重新启动进程,它会直接提供“未处理的异常:System.Net.Sockets.SocketException:打开的文件过多”。

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

我的问题: 是否有单什么,一直运行在全球无论哪个单声道应用程序启动时,一种服务,而无需重新启动我的电脑我可以重新开始吗? 或者这不是一个单一的问题,而是一个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。对于生产,我们可以决定使用哪个平台。

回答

0

这听起来像你需要设置(或取消)插座上的灵儿选项(使用Socket.SetSocketOption)。根据你使用的有可能是更好的选择实际的API(TcpClient的有LingerState属性实例)。