2009-12-02 131 views
1

我是一个dotnet propgrammer。最近我编写了使用system.net.sockets进行连接的aclient服务器应用程序,并检查客户机是否启用了定时器,客户机发送用于检查活动的byte.minvalue。当客户端断开连接时,我关闭套接字并关闭它。这项工作很好,但是当客户端数量增加时,连接无法建立并出现问题。我使用2000值的积压,但不能正常工作? 帮帮我!套接字队列问题?

回答

1

这很模糊,一些更详细的信息(你在客户端和/或服务器上得到的错误)或者某些代码(你如何接受服务器上的连接?)可能会有所帮助。

在此期间,我会在你扔一些随机猜测...

如果你正在创建和销毁迅速从你的客户端的连接和你正在运行大量客户端对测试服务器同一台机器,那么由于TIME_WAIT,您可能会因插槽用尽而受损。同样,如果您通过在同一个Windows计算机上创建大量客户端连接(通常超过4000个)来测试服务器,则可能会运行默认的MAX_USER_PORT设置,这会严重限制您可以在一个时间。

0

为什么在调用OnClientAccept时会锁定?这是一个瓶颈。

如果你需要一个锁,在OnClientAccept内部做更细的修改。

另外。切换到BeginAccept/EndAccept以提高速度。

internal class SocketServer 
{ 
    private readonly IPAddress _address; 
    private readonly int _port; 
    private TcpListener _listener; 

    public SocketServer(IPAddress address, int port) 
    { 
     _address = address; 
     _port = port; 
    } 

    public void Start(int backlog) 
    { 
     if (_listener != null) 
      return; 

     _listener = new TcpListener(_address, _port); 
     _listener.Start(backlog); 
     _listener.BeginAcceptSocket(OnAccept, null); 
    } 

    private void OnAccept(IAsyncResult ar) 
    { 
     TcpClient client = null; 
     try 
     { 
      client = _listener.EndAcceptTcpClient(ar); 
     } 
     catch(Exception err) 
     { 
      // log here. Eat all exceptions so the server will not die. 
      // i usually have a ExceptionThrown event to let other code 
      // debug asynchrounous exceptions. 
     } 

     // Begin to accept clients asap 
     try 
     { 
      _listener.BeginAcceptTcpClient(OnAccept, null); 
     } 
     catch(Exception) 
     { 
      // read above exception comment. 
     } 


     // this accept failed, lets not do anything with the client. 
     if (client == null) 
      return; 

     try 
     { 
      OnClientAccepted(client); 
     } 
     catch(Exception) 
     { 
      // read above exception comment. 
     } 
    } 

    private void OnClientAccepted(TcpClient client) 
    { 
     throw new NotImplementedException(); 
    } 


} 
0

客户端如何快速连接/断开? TCP套接字不会立即关闭,它们会进入TIME_WAIT状态并暂停一段时间(我认为Windows上的默认值为120secs)。这可能会导致所有套接字被使用,并且新的连接被拒绝。

MSDN信息在这里:http://msdn.microsoft.com/en-us/library/ms819739.aspx

在服务器类型:

netstat -a 

如果你有大量的TIME_WAIT连接,那么你需要的时间缩短关闭插座挂一下。