В настоящее время я программирую тест для моего 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_);
}
Как видите, я уже пробовал много разных методов закрытия, но сосед работает.
Могу ли я что-нибудь сделать в этом случае?У кого-нибудь еще есть такая же проблема?