1

次のように、特定のIPのポートのステータスとポート番号を確認できる小さなツールを作成しています。

private void ScanPort(IPAddress address, int port)
{
    using (TcpClient client = new TcpClient())
    {
        try
        {
            client.Connect(address, port);
            txtDisplay.AppendText("Port: " + nudFrom.Value.ToString() + 
                " is open." + Environment.NewLine);
        }
        catch (SocketException)
        {
            txtDisplay.AppendText("Port: " + nudFrom.Value.ToString() +
                " is closed." + Environment.NewLine);
        }
    }
}

問題は、ポートが開いている場合、チェックに約1秒かかり、ポートが閉じている場合、プロセスに約20秒かかることです。

開いている/閉じているポートのチェックをすばやく行うにはどうすればよいですか?

4

2 に答える 2

2

1つのオプションは、SharpPcapやPcap.NETなどのrawソケットを使用してこれを実装し、ICMP障害応答をキャッチすることです。より簡単なアプローチは、タイムアウトの削減を検討することです。これを行う方法に関するいくつかのアイデアがあります。これも役立つかもしれない関連する質問です

投稿したコードのパフォーマンスを改善する方法を厳密に探している場合は、接続を試みる前にアドレスにpingを実行することを検討してください(これは、ARPのリモートホストに関する以前の質問に関連していると想定しています)。文字列は不変です。+演算子は通常、のようなものを使用するよりも低速ですString.Format。ただし、これらの提案によって処理が数秒短縮されることはありません(実際、違いがわからない可能性があります)。

于 2012-01-24T03:49:13.280 に答える
1

ネットワーク上のすべてのIPアドレスにpingを実行し、応答を返すために、このようなツールを作成しました。

このために、.net4.0並列for/foreach機能を使用しました。パフォーマンスが劇的に向上しました。

于 2012-01-24T04:44:32.583 に答える