проблема очереди сокетов? - PullRequest
1 голос
/ 02 декабря 2009

Я - дотнет-программист. недавно я написал серверное приложение клиента, которое использует system.net.sockets для подключения и проверяет, включен ли клиент с таймером, который клиенты отправляют byte.minvalue для проверки работоспособности. когда клиент отключился, я закрыл сокет и закрыл его. это работает нормально, но когда число клиентов увеличилось, соединения не могут быть установлены и возникла проблема. Я использую отставание со значением 2000, но не работает правильно? Помоги мне!

Ответы [ 3 ]

1 голос
/ 02 декабря 2009

Это довольно расплывчато, некоторые подробности (ошибки, которые вы получаете на клиенте и / или сервере) или какой-то код (как вы принимаете соединения на сервере?) Могут помочь.

А пока я подкину несколько случайных догадок ...

Если вы быстро создаете и уничтожаете соединения от своих клиентов и тестируете свой сервер, запуская множество клиентов на одной и той же машине, то у вас может возникнуть нехватка сокетов из-за TIME_WAIT. Аналогично, если вы тестируете свой сервер, создавая множество клиентских подключений (как правило, более 4000) с одной и той же машины Windows, вы можете использовать настройку по умолчанию MAX_USER_PORT, которая строго ограничивает количество одновременных исходящих подключений, которые вы можете установить. в одно время.

0 голосов
/ 22 декабря 2009

Как быстро клиенты подключаются / отключаются? TCP-сокеты закрываются не сразу, они переходят в состояние TIME_WAIT и некоторое время задерживаются (я думаю, что по умолчанию в Windows это 120 секунд) Это может привести к использованию всех сокетов и отказу в новых подключениях.

MSDN информация здесь: http://msdn.microsoft.com/en-us/library/ms819739.aspx

На сервере тип:

netstat -a

Если у вас большое количество подключений TIME_WAIT, вам нужно сократить время зависания закрытых сокетов.

0 голосов
/ 22 декабря 2009

Почему вы блокируете при вызове 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();
    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...