我似乎无法找到任何告诉我路由器中的端口是否打开的东西.这甚至可能吗?
我现在的代码似乎并没有真正起作用......
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);
}
}
Run Code Online (Sandbox Code Playgroud) 下图显示了在本地计算机上尝试并成功将侦听套接字(服务器)绑定到端口10000的两个进程:

这是netstat的输出(用于确认):
netstat -a -n | find "10000"
TCP 0.0.0.0:10000 0.0.0.0:0 LISTENING
TCP 0.0.0.0:10000 0.0.0.0:0 LISTENING
TCP [::]:10000 [::]:0 LISTENING
Run Code Online (Sandbox Code Playgroud)
(注意:javaw.exe进程是第一个在10000上打开listen套接字的进程).
虽然我知道多个进程确实可以在同一个端口(SO_REUSEADDR)上侦听的情况,但在我的特定情况下有些事情让我感到烦恼:
在我的应用程序中,我特别向.NET说我想要一个独有的 listen socket(SO_EXCLUSIVEADDRUSE)via
listener = new TcpListener(adr, ipport);
listener.ExclusiveAddressUse = true;
Run Code Online (Sandbox Code Playgroud).NET并没有抛出任何类型的异常/错误/通知该端口已在使用.事实上,它实际上认为一切都很顺利.
从那时起,我的服务器应用程序永远不会从listener.AcceptTcpClient()呼叫中唤醒.应该与服务器通信的客户端应用程序接收有效连接,但无法与"我的"服务器通信(据推测,因为它建立了与"其他"进程的连接,该进程不会说"协议").
如果有人想尝试重现我的发现:第二个过程是Eclipse(PHP)的"Helios"版本.但具体过程在这里并不重要:如果一个过程可以在操作系统下做奇怪的事情,那么其他过程也是如此.
关于我如何得到错误或完全阻止这种情况(通过附加参数)的任何建议?
我正在开发一个使用3个端口[TCP SOCKET .Net 4.0]的服务器 - 客户端应用程序.
因此,应用程序为用户提供了仅为主套接字设置端口的选择.但我想让服务器应用程序自动找到其他2个套接字的可用端口,以便使用主套接字连接将端口值发送到客户端.然后客户端使用接收的端口值连接到另一个套接字.
这里有一点解释:
[我知道你可能会说我应该使用相同的套接字进行文件传输和截图,但它有点复杂.我只是为每一个使用单独的套接字.]
那么在将套接字与端点绑定之前,如何找到可用端口?这样的事情:
int port = 10000;
bool isAvailable = false;
while(!isAvailable)
{
try
{
// check if the port is available to use.
isAvailable = true;
}
catch
{
port++;
}
}
Run Code Online (Sandbox Code Playgroud)
我目前正在使用此函数调用来创建我的tcpClient:
clientSocket = new TcpClient("localhost", clientPort);
Run Code Online (Sandbox Code Playgroud)
但这clientPort是服务器的端口.
有没有办法让我使用tcpClient指定客户端端口?
谢谢
我需要从 .NET 4.0 监视 64 位 Windows 7 计算机上单个进程所持有的打开 TCP 连接数。
本文描述了未记录的 Win32 API 方法“AllocateAndGetTcpExTableFromStack”,该方法在 32 位 Windows 上完成此任务:
http://www.codeproject.com/KB/IP/iphlpapi.aspx?display=Print
但这在我的机器上失败了(大概是因为我使用的是 64 位):
无法在 DLL“iphlpapi.dll”中找到名为“AllocateAndGetTcpExTableFromStack”的入口点。
我们如何在 64 位 Windows 上做到这一点?
我使用下面的代码创建一个TCP侦听器:
TCPListener = new TcpListener(IPAddress.Any, 1234);
Run Code Online (Sandbox Code Playgroud)
我开始使用以下代码监听TCP设备:
TCPListener.Start();
Run Code Online (Sandbox Code Playgroud)
但在这里,我无法控制端口是否正在使用中.当端口正在使用时,程序会给出一个例外:"通常只允许使用每个套接字地址(协议/网络地址/端口)."
我该如何处理这个例外?我想警告用户端口正在使用中.
这就是我的问题的答案。
如何在 C# 中列出绑定/使用的 TCP 端口。使用jro的修改代码
static void ListUsedTCPPort(ref ArrayList usedPort)
{
IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpListeners();
IEnumerator myEnum = tcpConnInfoArray.GetEnumerator();
while (myEnum.MoveNext())
{
IPEndPoint TCPInfo = (IPEndPoint)myEnum.Current;
usedPort.Add(TCPInfo.Port);
}
}
Run Code Online (Sandbox Code Playgroud)
原始问题。 这就是我使用 C# 列出 TCP 端口的方式。这是我在这个论坛中找到的修改后的代码(忘记了我到底是从哪里得到的。如果您是原始开发人员,请通知我,并在适当的时候注明积分。)
//List used tcp port
static void ListUsedTCPPort(ref ArrayList usedPort)
{
IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
TcpConnectionInformation[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpConnections();
IEnumerator myEnum = tcpConnInfoArray.GetEnumerator();
while (myEnum.MoveNext())
{
TcpConnectionInformation TCPInfo = (TcpConnectionInformation)myEnum.Current;
usedPort.Add(TCPInfo.LocalEndPoint.Port);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,结果与 TCPview(协议-TCP,本地端口)中列出的使用的 tcp 端口不同。顺便说一句,我确实知道这个列表在调用的确切时间使用了 TCP 端口。我做错了什么?