首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查端口是否打开

检查端口是否打开
EN

Stack Overflow用户
提问于 2012-08-07 07:55:44
回答 10查看 84.3K关注 0票数 31

我似乎找不到任何能告诉我路由器中的端口是否打开的东西。这有可能吗?

我现在拥有的代码似乎并不是真的有效...

代码语言:javascript
运行
复制
private void ScanPort()
{
    string hostname = "localhost";
    int portno = 9081;
    IPAddress ipa = (IPAddress) Dns.GetHostAddresses(hostname)[0];
    try
    {
        System.Net.Sockets.Socket sock =
                new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork,
                                              System.Net.Sockets.SocketType.Stream,
                                              System.Net.Sockets.ProtocolType.Tcp);
        sock.Connect(ipa, portno);
        if (sock.Connected == true) // Port is in use and connection is successful
            MessageBox.Show("Port is Closed");
        sock.Close();
    }
    catch (System.Net.Sockets.SocketException ex)
    {
        if (ex.ErrorCode == 10061) // Port is unused and could not establish connection 
            MessageBox.Show("Port is Open!");
        else
            MessageBox.Show(ex.Message);
    }
}
EN

回答 10

Stack Overflow用户

发布于 2012-08-07 08:09:59

试试这个:

代码语言:javascript
运行
复制
using(TcpClient tcpClient = new TcpClient())
{
    try {
        tcpClient.Connect("127.0.0.1", 9081);
        Console.WriteLine("Port open");
    } catch (Exception) {
        Console.WriteLine("Port closed");
    }
}

您可能应该将127.0.0.1更改为类似于192.168.0.1或您的路由器的IP地址。

票数 49
EN

Stack Overflow用户

发布于 2016-07-08 10:39:07

一个更好的解决方案,你甚至可以指定一个超时:

代码语言:javascript
运行
复制
using System;
using System.Net.Sockets;

// ...

bool IsPortOpen(string host, int port, TimeSpan timeout)
{
    try
    {
        using(var client = new TcpClient())
        {
            var result = client.BeginConnect(host, port, null, null);
            var success = result.AsyncWaitHandle.WaitOne(timeout);
            client.EndConnect(result);
            return success;
        }
    }
    catch
    {
        return false;
    }
}

并且,在F#中:

代码语言:javascript
运行
复制
open System
open System.Net.Sockets

let isPortOpen (host: string) (port: int) (timeout: TimeSpan): bool =
    try
        use client = new TcpClient()
        let result = client.BeginConnect(host, port, null, null)
        let success = result.AsyncWaitHandle.WaitOne timeout
        client.EndConnect result
        success
    with
    | _ -> false

let available = isPortOpen "stackoverflow.com" 80 (TimeSpan.FromSeconds 10.)
printf "Is stackoverflow available? %b" available
票数 35
EN

Stack Overflow用户

发布于 2017-02-28 00:26:36

除非有程序在监听该端口,否则无法知道该端口是否在您的路由器中转发。

正如您在克林顿的答案中看到的,正在使用的.Net类是TcpClient,这是因为您正在使用TCP套接字进行连接。这就是操作系统建立连接的方式:使用套接字。但是,路由器只是将数据包( OSI模型的第3层)转发进来或转发出去。在您的例子中,您的路由器正在执行的操作称为: NAT。一个或多个内网IP共享一个外网IP。这就是为什么你要做一个端口转发。

在数据包的路径上可能有很多路由器,您永远不会知道发生了什么。

让我们假设你正在用传统的方式发送一封信。也许你可以在信中写下接收者必须回复,以检查他/她是否在那里(你和接收者是插座)。如果你收到了回复,你肯定他/她在那里,但如果你没有收到任何东西,你就不知道是邮递员(在你的情况下是路由器)忘了投递信件,还是接收者没有回复。你也永远不会知道邮递员是否让朋友递送那封信。此外,邮递员不会为了知道他/她可能会回复而打开信件,因为你正在等待回复。你所能做的就是等待一段时间来收到答案。如果你在这段时间内没有收到任何东西,你就会认为收信人不在你寄出信件的地方。这是一个“超时”。

我看到一个答案提到了nmap软件。这真的是一个非常好和复杂的软件,但我认为它会以同样的方式工作。如果没有应用程序在该端口上侦听,则无法知道该端口是否打开。

如果我说清楚了,请告诉我。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11837541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档