В настоящее время я программирую базовый уровень для своего 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_);
}
Как вы можете видеть, что я уже пробовал много различных методов, близких , но сосед работает.
Есть ли что-нибудь, что я могу сделать в этом случае? У кого-нибудь еще такая же проблема?
После того, как вы считаете, что вы закрываете сокет в Windows, он остается в 'TIME_WAIT' (вы можете просмотреть его с помощью TcpView или netstat) в течение некоторого времени, прежде чем использовать его. Также есть максимальное количество подключений в Windows. Для их контроля есть настройки реестра. Наконец, вам нужно явно называть «Dispose» в соединении? –
Ну, сначала tcp-сервер работает на сервере ubuntu. У меня есть программа Thread в сервере, которая выводит количество одновременных подключенных пользователей. Когда Сокеты находятся в состоянии TIME_WAIT, они не должны отображаться там, я думаю. Я также настроил сервер, чтобы обрабатывать больше, чем число 1024 подключений по умолчанию, поэтому это не может быть причиной. –