TCP / IP消息应用程序VB.net - IP地址/端口转发问题

时间:2016-08-30 01:26:15

标签: vb.net sockets networking tcp portforwarding

我正在开发一个我打算分发的VB.net中的科学软件。部分应用程序将涉及与服务器(和其他客户端)的通信。对于所有意图和目的,通信将像聊天应用程序。

我使用套接字开发了这个软件,在我本地网络上进行测试时它可以正常工作。以下基本上是我发送消息的方式:

Dim serverIPString as String = "192.168.1.5"
Dim serverPort as long = 65500
dim messageString as String = "Hello"
Dim Client As New System.Net.Sockets.TcpClient(serverIPString, serverPort)
Dim Writer As System.IO.StreamWriter(Client.GetStream())

Writer.Write(messageString)
Writer.Flush()
Writer.Close()

这就是我的倾听方式:

Public Class TCPIPListener
    Dim initalised As Boolean = False
    Dim port As Long
    Dim IP As System.Net.IPAddress
    Dim ourListener As TcpListener
    Dim ourClient As TcpClient
    Dim ourMessage As String

    '''''''''''
    '' ctors ''
    '''''''''''

    Public Sub New()
        initalised = False
    End Sub

    'Takes IP and port and starts listeing
    Public Sub New(inIP As String, inPort As Long, inExchange As messageExchange)
        'Try to set the IP
        Try
            IP = System.Net.IPAddress.Parse(inIP)
        Catch ex As Exception
            Exit Sub
        End Try

        'Set the port
        port = inPort

        initalised = startListener()

    End Sub

    '''''''''''''''
    '' Listening ''
    '''''''''''''''

    Private Sub Listening()
        ourListener.Start()
    End Sub

    'starts listener
    Public Function startListener() As Boolean
        ourListener = New TcpListener(IP, port)
        ourClient = New TcpClient()

        Dim ListenerThread As New Thread(New ThreadStart(AddressOf Listening))
        ListenerThread.Start()

        initalised = True

        Return True
    End Function

    'Called from a timer on the form
    Public Function tick() As Boolean
        If Not initalised Then
            Return False
        End If

        If ourListener.Pending = True Then
            ourMessage = ""

            ourClient = ourListener.AcceptTcpClient()

            Dim Reader As New System.IO.StreamReader(ourClient.GetStream())
            While Reader.Peek > -1
                ourMessage = ourMessage + Convert.ToChar(Reader.Read()).ToString
            End While

            messagebox(ourMessage)
        End If

        Return True
    End Function
End Class

使用这种方法,每个客户端都将监听从服务器发送的消息,并且发送的任何消息都将发送到服务器并被定向到相关客户端 - 它的效率有点低,但对于我的软件来说是必要的作品。

问题是我在互联网上工作时遇到了麻烦。如果我向本地IP地址发送消息,它甚至可以从调试器中正常工作。如果我使用外部IP地址,我会得到以下结果:

  

无法建立连接,因为目标计算机主动拒绝了它XXX.XXX.XXX.XXX:65500"

我已经使用我的路由器启用了端口转发并设置了正确的端口(此处为65500)以转发到运行lister(192.168.1.5)的PC和TCP。 This网站告诉我这个端口是开放的,而那些端口都不是。

如果我右键单击exe并以管理员身份运行,我的防病毒软件会弹出并说当我启动监听器时它正在做一些可疑的事情(我想如果有什么令人鼓舞的话)。如果我然后将我的应用程序添加到异常列表并再次运行它,然后检查端口是否正在侦听(使用this)我发现我的应用程序正在侦听正确的端口(如果我停止应用程序它是走了)。但是,客户端应用程序仍然提供上述相同的错误。如果我使用随机IP地址而不是其中一个侦听器,我会得到一个不同的错误:

  

{"连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应XXX.XXX.XXX.XXX:65500"}

我怀疑我没有采取正确的方法。我对VB的大多数方面都很好,但之前并没有真正解决过这类问题。在分发软件方面,我真的不希望我的客户不得不使用深层设置来使这个应用程序正常工作。任何帮助对我都非常有用!

我想我将来面临的另一个问题是,如果多个客户端具有相同的外部IP但内部IP不同(我打算分发给大学)。在这种情况下,我猜端口转发不起作用。

非常感谢(并为长篇文章道歉)!

1 个答案:

答案 0 :(得分:0)

如果您将服务器设置为侦听192.168.1.5上的连接,那么它将仅允许来自该特定IP地址的连接 。您提供TcpListener的地址是您将接受来自的连接的IP地址。

由于192.168.1.5地址是内部的,因此网络外的任何人都无法连接到您的服务器。让您的服务器收听0.0.0.0(或等效的IPAddress.Any),以使其允许任何人建立连接。

相关问题