C# - 端口扫描器

3
我尝试制作端口扫描器,但由于某些原因,它的工作效果不佳:
代理列表:
138.68.169.8

我的代码:

    private static string IP = "";

    static void Main(string[] args)
    {
        UserInput();
        PortScan();
        Console.ReadKey();
    }

    private static void UserInput()
    {
        Console.WriteLine("IP Address:", Color.Lime);
        IP = Console.ReadLine();
    }

    private static void PortScan()
    {
        Console.Clear();
        TcpClient Scan = new TcpClient();
        foreach(int s in Ports)
        {
            try
            {
                Scan.Connect(IP, s);
                Console.WriteLine($"[{s}] | OPEN", Color.Green);
            }
            catch
            {
                Console.WriteLine($"[{s}] | CLOSED", Color.Red);
            }
        }
    }

    private static int[] Ports = new int[]
    {
        8080,
        51372,
        31146,
        4145
    };

异常:

[8080] | OPEN
[51372] | CLOSEDSystem.Net.Sockets.SocketException (0x80004005): A connect request was made on an already connected socket

其他端口也有同样的例外情况。
为什么在代理:端口不同时还说是开放端口呢?

1
你能包含被捕获的异常吗?另外,你可能想要编辑你的问题标题以反映你的问题,而不是你的项目名称。 - ProgrammingLlama
1
从TcpClient.Connect的文档中可以得知:“注意,如果您收到SocketException异常,请使用SocketException.ErrorCode来获取特定的错误代码。一旦您获得了这个代码,您可以参考MSDN中的Windows Socket Version 2 API错误代码文档来获取详细的错误描述。” - PhillipH
@John 我更新了问题。 - Daniel
1
@PhillipH 我现在明白了,我必须先断开连接,然后再连接到新的端口。 - Daniel
1个回答

7

尝试在已经连接的套接字上进行连接请求

错误信息意味着您已经建立了一个连接,并且正在尝试使用同一客户端建立另一个连接。在打开另一个之前,您应该关闭第一个连接。

我建议将TcpClient放入循环中的using块中,以便在连接尝试之间关闭连接并处理客户端:

foreach(int s in Ports)
{
    using (TcpClient Scan = new TcpClient())
    {
        try
        {
            Scan.Connect(IP, s);
            Console.WriteLine($"[{s}] | OPEN", Color.Green);
        }
        catch
        {
            Console.WriteLine($"[{s}] | CLOSED", Color.Red);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接