2012-01-15 1 views
0

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

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

Когда я использую меньшее количество соединений (100 одновременных и 1000 подключений), все работает нормально, но с настройкой ab ove, некоторые из соединений остаются подключенными на сервере. Это означает, что вызов 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_); 
    } 

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

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

+0

После того, как вы считаете, что вы закрываете сокет в Windows, он остается в 'TIME_WAIT' (вы можете просмотреть его с помощью TcpView или netstat) в течение некоторого времени, прежде чем использовать его. Также есть максимальное количество подключений в Windows. Для их контроля есть настройки реестра. Наконец, вам нужно явно называть «Dispose» в соединении? –

+0

Ну, сначала tcp-сервер работает на сервере ubuntu. У меня есть программа Thread в сервере, которая выводит количество одновременных подключенных пользователей. Когда Сокеты находятся в состоянии TIME_WAIT, они не должны отображаться там, я думаю. Я также настроил сервер, чтобы обрабатывать больше, чем число 1024 подключений по умолчанию, поэтому это не может быть причиной. –

ответ

0

Возможно, мне что-то не хватает, но какой тип имеет mClient_.Client?

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

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

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

+0

В этом случае это была проблема с сервером, но не с кодом сервера, больше с сервером и его латентностью в сети или так, потому что я протестировал его на простой небольшой проблеме V-Server ->, как описано, Root-Server -> Нет проблем. Спасибо за ваше предложение. –