相关疑难解决方法(0)

检查端口是否打开

我似乎无法找到任何告诉我路由器中的端口是否打开的东西.这甚至可能吗?

我现在的代码似乎并没有真正起作用......

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)

.net c# winforms

23
推荐指数
2
解决办法
6万
查看次数

2侦听同一端口的进程 - .NET不会抛出异常

下图显示了在本地计算机上尝试并成功将侦听套接字(服务器)绑定到端口10000的两个进程:

Sysinternals在端口10000上显示2个绑定

这是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)上侦听的情况,但在我的特定情况下有些事情让我感到烦恼:

  1. 在我的应用程序中,我特别向.NET说我想要一个独有的 listen socket(SO_EXCLUSIVEADDRUSE)via

    listener = new TcpListener(adr, ipport);
    listener.ExclusiveAddressUse = true;
    
    Run Code Online (Sandbox Code Playgroud)
  2. .NET并没有抛出任何类型的异常/错误/通知该端口已在使用.事实上,它实际上认为一切都很顺利.

  3. 从那时起,我的服务器应用程序永远不会从listener.AcceptTcpClient()呼叫中唤醒.应该与服务器通信的客户端应用程序接收有效连接,但无法与"我的"服务器通信(据推测,因为它建立了与"其他"进程的连接,该进程不会说"协议").

如果有人想尝试重现我的发现:第二个过程是Eclipse(PHP)的"Helios"版本.但具体过程在这里并不重要:如果一个过程可以在操作系统下做奇怪的事情,那么其他过程也是如此.

关于我如何得到错误或完全阻止这种情况(通过附加参数)的任何建议?

.net sockets port networking

18
推荐指数
1
解决办法
1771
查看次数

如何在将套接字与端点绑定之前找到可用端口?

我正在开发一个使用3个端口[TCP SOCKET .Net 4.0]的服务器 - 客户端应用程序.
因此,应用程序为用户提供了仅为主套接字设置端口的选择.但我想让服务器应用程序自动找到其他2个套接字的可用端口,以便使用主套接字连接将端口值发送到客户端.然后客户端使用接收的端口值连接到另一个套接字.

这里有一点解释:

  • 主套接字侦听可配置端口.此套接字接受客户端以启动发送/接收命令.(文件资源管理器/任务管理器/ properties/shutdown/chat)
  • 第二个套接字仅用于文件传输以传输文件,并在完成后关闭.
  • 第三个套接字仅用于接收/发送屏幕截图.

    [我知道你可能会说我应该使用相同的套接字进行文件传输和截图,但它有点复杂.我只是为每一个使用单独的套接字.]

    那么在将套接字与端点绑定之前,如何找到可用端口?这样的事情:

    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)
  • c# sockets port client-server

    16
    推荐指数
    1
    解决办法
    2万
    查看次数

    有没有办法指定tcpClient中使用的本地端口?

    我目前正在使用此函数调用来创建我的tcpClient:

    clientSocket = new TcpClient("localhost", clientPort);
    
    Run Code Online (Sandbox Code Playgroud)

    但这clientPort是服务器的端口.

    有没有办法让我使用tcpClient指定客户端端口?

    谢谢

    c# sockets

    12
    推荐指数
    1
    解决办法
    1万
    查看次数

    确定端口是否正在使用?

    有没有办法,使用C#来确定端口是否可用?我想在使用已经使用的端口启动WCF ServiceHost实例之前检查:-)

    c# wcf

    7
    推荐指数
    1
    解决办法
    2万
    查看次数

    如何获取.NET中某个进程持有的打开的TCP连接数

    我需要从 .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 上做到这一点?

    .net pinvoke winapi windows-7

    5
    推荐指数
    1
    解决办法
    5131
    查看次数

    在C/C++中检查打开的端口

    关于验证套接字端口的可访问性和可访问性的主题还有其他 问题.

    如何在C/C++中动态查找端口?

    我想要完成的基本过程是这样的:

    1. 客户启动
    2. 客户端找到开放端口XYZ并侦听它.
    3. 客户端通过UDP数据报将基本的"我在这里"消息发送到具有端口信息的服务器
    4. 客户端和服务器可以通信.

    我知道如果您选择任意端口号并尝试绑定它,您可以完成类似的操作.如果失败,请递增数字并再次尝试,直到您获得成功的"绑定".

    有没有更优雅的方式来做到这一点?这似乎有点hacky.

    c c++ sockets network-programming

    3
    推荐指数
    1
    解决办法
    3913
    查看次数

    TCP侦听器在C#中启动异常

    我使用下面的代码创建一个TCP侦听器:

    TCPListener = new TcpListener(IPAddress.Any, 1234);
    
    Run Code Online (Sandbox Code Playgroud)

    我开始使用以下代码监听TCP设备:

    TCPListener.Start();
    
    Run Code Online (Sandbox Code Playgroud)

    但在这里,我无法控制端口是否正在使用中.当端口正在使用时,程序会给出一个例外:"通常只允许使用每个套接字地址(协议/网络地址/端口)."

    我该如何处理这个例外?我想警告用户端口正在使用中.

    .net c# tcplistener exception

    2
    推荐指数
    1
    解决办法
    5543
    查看次数

    使用 C# 列出已使用的 TCP 端口

    这就是我的问题的答案。

    如何在 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 端口。我做错了什么?

    c# port tcp

    1
    推荐指数
    1
    解决办法
    1万
    查看次数