套接字队列问题?

时间:2009-12-02 13:24:49

标签: .net sockets

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

3 个答案:

答案 0 :(得分:1)

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

与此同时,我会随便猜一下......

如果您正在快速创建和销毁来自客户端的连接,并且您通过在同一台计算机上运行大量客户端来测试服务器,则可能会因TIME_WAIT而导致套接字耗尽。同样,如果您通过从同一台Windows计算机创建大量客户端连接(通常超过4000)来测试服务器,那么您可能会遇到默认的MAX_USER_PORT设置,严重限制了您的并发出站连接数可以一次制作。

答案 1 :(得分: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();
    }


}

答案 2 :(得分:0)

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

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

在服务器上输入:

netstat -a

如果你有大量的TIME_WAIT连接,那么你需要减少关闭套接字的时间。