C# に TCP トンネルがあります。サーバーとクライアントの間のアプリであるトンネルを開閉する必要があります。これを使用してデータ接続を閉じ、別のアプリをテストしています。特定のポートを使用する必要があります。
2 番目、3 番目、n 番目の接続で、再接続までの待機時間に応じて、ソケットをバインドするときに「アドレスは既に使用されています」という 10048 エラー コードが表示されます。ソケットを閉じるときは、ポートをクリアすることを期待して ShutDown.Both と Close を実行しますが、コマンド プロンプトで netstat を実行すると、まだポートが TIME_WAIT に保持されていることがわかります。また、ソケットをノーリンガーに設定しました。最後にポートの状態を確認するループを作ってみたのですが、なんだか無限ループに陥ってしまいます。4分のTIME_WAITルールだと思います。
nestatクエリを表示する関数があり、それを実行すると、ポートがESTABLISHEDからバインドできるTIME_WAITになるまでチェックすることがわかりましたが、このクエリの同じデータを使用してループでバインドすると、ステータスが TIME_WAIT に達し、10048 が表示されます。ボタンのクリックによってバインドできるようになる短い時間はありますか? TIME_WAIT と ESTABLISHED の間に状態はありますか? ボタンをクリックしたときではなく、ループでヒットしていますか? TIME_WAIT はバインドを完全に停止する必要があると読みましたが、これは正しくないようです。誰でもこれを説明できますか?
コード愛好家の皆様、申し訳ありません。しかし、これで何かが変わるとは考えていません。ポートの状態をよりよく理解する必要があります。
public bool CheckAvailablePorts()
{
int temp=0;
bool availPort= true;
m_config = new AppConfig();
if (!m_config.initialize())
{
System.Diagnostics.Debug.WriteLine("Error loading configuration file. Exiting...");
return false;
}
else
{
//checking through all the ports that have been set to connect on
foreach (ProxyConfig cfg in m_config.m_proxyConfigs)
{
availPort = true;
temp = cfg.localEP.Port;
DataView dv = FindEstablishedSockets();//returns netstat query
foreach (DataRowView rowView in dv)
{
DataRow row = rowView.Row;
if ((Convert.ToInt32(row["Local Port"].ToString()) == temp) && (row["Status"].ToString().Equals("Established")))
{
System.Diagnostics.Debug.WriteLine("Port: " + temp + " is still locked");
availPort = false;
break;
}
}
}
return availPort;
}
}
//snippet out of a bigger function which checks for availability and then sleeps if false and runs again
bool temp = false;
while (!temp)
{
temp = monitor.CheckAvailablePorts();
System.Threading.Thread.Sleep(2000);
}
System.Threading.Thread.Sleep(3000);
monitor.startApplication(); //starts all the binding