我似乎找不到任何能告诉我路由器中的端口是否打开的东西。这有可能吗?
我现在拥有的代码似乎并不是真的有效...
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);
}
}发布于 2012-08-07 08:09:59
试试这个:
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地址。
发布于 2016-07-08 10:39:07
一个更好的解决方案,你甚至可以指定一个超时:
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#中:
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发布于 2017-02-28 00:26:36
除非有程序在监听该端口,否则无法知道该端口是否在您的路由器中转发。
正如您在克林顿的答案中看到的,正在使用的.Net类是TcpClient,这是因为您正在使用TCP套接字进行连接。这就是操作系统建立连接的方式:使用套接字。但是,路由器只是将数据包( OSI模型的第3层)转发进来或转发出去。在您的例子中,您的路由器正在执行的操作称为: NAT。一个或多个内网IP共享一个外网IP。这就是为什么你要做一个端口转发。
在数据包的路径上可能有很多路由器,您永远不会知道发生了什么。
让我们假设你正在用传统的方式发送一封信。也许你可以在信中写下接收者必须回复,以检查他/她是否在那里(你和接收者是插座)。如果你收到了回复,你肯定他/她在那里,但如果你没有收到任何东西,你就不知道是邮递员(在你的情况下是路由器)忘了投递信件,还是接收者没有回复。你也永远不会知道邮递员是否让朋友递送那封信。此外,邮递员不会为了知道他/她可能会回复而打开信件,因为你正在等待回复。你所能做的就是等待一段时间来收到答案。如果你在这段时间内没有收到任何东西,你就会认为收信人不在你寄出信件的地方。这是一个“超时”。
我看到一个答案提到了nmap软件。这真的是一个非常好和复杂的软件,但我认为它会以同样的方式工作。如果没有应用程序在该端口上侦听,则无法知道该端口是否打开。
如果我说清楚了,请告诉我。
https://stackoverflow.com/questions/11837541
复制相似问题