Многие TCPClients в бенчмарке не закрываются должным образом - PullRequest
0 голосов
/ 15 января 2012

В настоящее время я программирую тест для моего TCP-Socket Server.Основная концепция заключается в следующем:

  • Клиент создает 10000 подключений
  • Есть 2500 одновременных подключений
  • Все они отправляют 10-секундные сообщения пинг-понга на сервери получаю понг
  • Через 10 секунд они все отключаются

Когда я использую меньшее количество соединений (100 одновременных и 1000 подключений), все работает нормально, но с настройкой выше,некоторые из соединений остаются подключенными на сервере.Это означает, что вызов close никогда не достигает сервера вообще.

Вот код для объяснения выше:

    class Program {   
    static List<Thread> mConnectionThreads_ = new List<Thread>();                  //!< The list of the Threads for all textloaders
    static List<TCPConnection> mConnections_ = new List<TCPConnection>();         //!< The list of TextsXMLParser

    static void Main(string[] args) {
        int numConnections = 10000;
        int numConcurrentConnections = 2500;
        for( int k = 0; k < numConnections/numConcurrentConnections; ++k) {
            for( int i = 0; i < numConcurrentConnections; ++i ) {
                TCPConnection connection = new TCPConnection();
                connection.connect(((k+1)*numConcurrentConnections)+i);
                mConnections_.Add(connection);
                mConnectionThreads_.Add(new Thread(connection.pingLoop));
            }
            Console.WriteLine(((k+1)*numConcurrentConnections) + "/" + numConnections + " Threads connected");

            // start all threads
            foreach (Thread t in mConnectionThreads_)
                t.Start();

            foreach (Thread t in mConnectionThreads_)
                t.Join();
            foreach (TCPConnection c in mConnections_)
                c.disconnect();
            Console.WriteLine(((k+1)*numConcurrentConnections) + "/" + numConnections + " Threads disconnected " + cnt + " calls");
            mConnections_.Clear();
            mConnectionThreads_.Clear();
        }
    }
}

Функция отключения выглядит следующим образом:

    public void disconnect() {
        if(  mClient_.Client != null ) {
            mClient_.Client.Disconnect(false);
            //mClient_.GetStream().Close();
            //mClient_.Close();
            Console.WriteLine("closed " + mConnectionId_);
        }
        else if( mClient_.Client == null )
            Console.WriteLine("closed invalid " + mConnectionId_);
    }

Как видите, я уже пробовал много разных методов закрытия, но сосед работает.

Могу ли я что-нибудь сделать в этом случае?У кого-нибудь еще есть такая же проблема?

1 Ответ

0 голосов
/ 16 января 2012

Может быть, я что-то упускаю, но какой тип имеет mClient_.Client?

Обычно, если вы используете TCP-клиент (класс TCPClient), вы можете вызвать Close, чтобы закрыть соединение.Таким же образом, когда вы используете напрямую Socket или NetworkStream, вы также можете вызывать Close.

С другой стороны, вы обнаруживаете и отлаживаете соединения, открытые / закрытые соединения на сервере, верно?Может быть вероятность того, что код сервера не обрабатывает соединение должным образом, и, таким образом, вы получаете неверную статистику.

Также при большой нагрузке у сервера может не хватить процессорного времени для обновления состояния соединений, поэтому вы можете ожидать некоторых задержек.Использует ли ваш сервер асинхронный ввод-вывод или принцип подключения к потоку?

...