私は現在、TCPソケットサーバーのベンチマークをプログラムしています。 基本的な考え方は以下の通りです:ベンチマークの多くのTCPクライアントが正しく閉じない
は- クライアントが10000個の接続を作成 彼らはすべてのサーバーに10秒のピンポンメッセージを送信し、ピンポン
- の後を受け
- 同時2500本の接続があります
- 彼らがすべて切断する10秒
接続数が少ない(100の同時接続と1000の接続)場合、すべて正常に動作しますが、セットアップab接続の一部はサーバーに接続されたままです。 これは、クローズコールがまったくサーバーに到達しないことを意味します。ここで
は、上記の説明のためのコードです:
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_);
}
あなたは、私はすでに別のcloseメソッドの多くを試してみた見ることができるようにしかし、くすみは働く。
この場合、何かできることはありますか?他の誰かが同じ問題を抱えていますか?
あなたがWindowsでソケットを閉じると思うと、それは使用可能になる前にしばらくの間、 'TIME_WAIT'(TcpViewまたはnetstatで見ることができます)のままです。また、Windowsには最大数の接続があります。これらを制御するレジストリ設定があります。最後に、接続上で明示的に 'Dispose'を呼び出す必要がありますか? –
まず、tcp-serverはubuntuサーバー上で動作します。私はServerプログラムにThreadを持っています。これは同時に接続されているユーザーの数を出力します。ソケットがTIME_WAIT状態にあるとき、私はそこに表示されるべきではありません。私はまた、1024の接続のデフォルト数より多くを処理するようにサーバーを構成しました。これが理由ではありません。 –