TCPListener Probleme im Netzwerk, aber lokal geht

Vlami

Grünschnabel
Ich habe mit den Forum einträgen die man hier über TCP Listener/Client findet angesehen und daraufhin einen TCP Listener und einen TCP Client gebaut und ich will nur einen Befehl übersenden das geht auch aber leider nur Lokal also mit der IP:127.0.0.1 aber so bald ich das im netzt versuche dann bleibt der Server Host = Listener.AcceptTcpClient() Hängen auch wenn der Client einen String schickt könnte das an meinem Ruter liegen oder an sonstige netzt Einstellungen oder einfach nur an der Programmierung?

Ich bitte um Hilfe
 
Hallo Vlami,

Hast du den entsprechenden Port auf dem Rechner freigegeben, auf dem der Server-Teil läuft?

Es kann natürlich auch an deinem Programm liegen. Poste doch bitte einmal die Teile für den Server und den Client.
 
Hi,

Du musst am Router deinen Port an den entsprechenden PC weiterleiten. Einfach mal die Konfigurationen durchforsten. Bei mir musste ich auch noch den Port bei der Firewall freigeben.

Denn die IP die du nach außen siehst (wieistmeineip.de) ist die deines Routers. Der Router weiß aber nichtan wen er Anfragen die an ihn geschickt werden weiterleiten soll
Gruß
Erik
 
Zuletzt bearbeitet:
Hier ist mein Code zum Server und Client und ich denke jetzt stark das dann am Code liegt weil ich mit einem anderen Code denn ich aus dem 101Beispielen von Microsoft habe das geschafft habe einen String zu übergeben. Es ist nur einwenig zu Kompliziert das in mein Prog einzugeben weil ich auch gestehen muss dass ich neu in diesem Thema bin

Code:
Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports Microsoft.VisualBasic
Namespace Multitasking_Privat_Verbindung_lan

    Public Class ClasLan_Server
        Public ip As String = "127.0.0.1"
        Public port As Integer
        Private AddrIP As IPAddress = IPAddress.Parse(ip)
        Private Listener As New TcpListener(AddrIP, port)
        Private Host As New TcpClient()
        Private Networkstream1 As NetworkStream

        Public Function Time_stream() As Boolean
            If Listener.Pending = True And Host.Connected = False Then
                Host = Listener.AcceptTcpClient()
                Networkstream1 = Host.GetStream
                Time_stream = True
            Else
                Time_stream = False
            End If
        End Function

        Public Function Empfang() As String
            Dim wert As String
            Dim ruck As String
            wert = ""

            If Host.Client.Available > 0 Then
                Dim Buffer(Host.Client.Available) As Byte
                Networkstream1.Read(Buffer, 0, Host.Client.Available)

                For Each item As Byte In Buffer
                    wert &= Microsoft.VisualBasic.Chr(item)
                Next
            End If

            Send("Der befehl wird versucht bearbeitet zu werden!")
            ruck = Net_Server_Privat_Befehle(wert)
            Empfang = ruck
            'Call close()
            'Call server_start()
        End Function

        Public Sub Send(ByVal massage As String)
            Dim msg As Byte() = System.Text.Encoding.ASCII.GetBytes(massage)
            Networkstream1.Write(msg, 0, msg.Length)

            Call close()
            Call server_start()
        End Sub

        Public Sub server_start()
            'Dim Listener As New TcpListener(Addr, 13000)
            Listener.Start()
            ForAuswahl.Time_Lan.Enabled = True
        End Sub

        Public Sub close()
            Networkstream1.Close()
            ForAuswahl.Time_Lan.Enabled = False
        End Sub
        Public Sub server_stop()
            Dim argunull As Object
            Dim aus_gabe As String
            Try
                Networkstream1.Close()
                Listener.Stop()
                ForAuswahl.Time_Lan.Enabled = False
            Catch e As NullReferenceException
                argunull = e
                Listener.Stop()
                ForAuswahl.Time_Lan.Enabled = False
            Catch e As ArgumentNullException
                argunull = e
                aus_gabe = "ArgumentNullException;"
            Catch e As SocketException
                argunull = e
                aus_gabe = "SocketException;"
            End Try
        End Sub
    End Class

    Public Class ClasLan_Client

        Public Function NetClient(ByVal server As [String], ByVal PORT As Int32, ByVal message As [String]) As String
            Dim gesentete_nachricht As String
            Dim argunull As Object

            ' Create a TcpClient.
            ' Note, for this client to work you need to have a TcpServer 
            ' connected to the same address as specified by the server, port
            ' combination.
            Try
                Dim client As New TcpClient(server, PORT)
                Try
                    ' Translate the passed message into ASCII and store it as a Byte array.
                    'Transformiert V: massage in ascii um unt schreibt es in ein beyt rein muss sein!
                    Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(message)

                    ' Get a client stream for reading and writing.
                    '  Stream stream = client.GetStream();
                    'Nimmt einen server und spricht den so an das er schreiben und lesen kann
                    Dim stream As NetworkStream = client.GetStream()

                    ' Send the message to the connected TcpServer. 
                    'Sendet eine byte V über das netz
                    stream.Write(data, 0, data.Length)

                    'Gesendete Nachricht in V schreiben
                    gesentete_nachricht = "Sent: " & message

                    ' Receive the TcpServer.response.
                    ' Buffer to store the response bytes.
                    data = New [Byte](256) {}

                    ' String to store the response ASCII representation.
                    Dim responseData As [String] = [String].Empty

                    ' Read the first batch of the TcpServer response bytes.

                    Dim bytes As Int32 = stream.Read(data, 0, data.Length)
                    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)

                    NetClient = "Antwort: " & responseData

                    ' Close everything.
                    stream.Close()
                    client.Close()
                Catch e As NullReferenceException
                    client.Close()
                    argunull = e
                    NetClient = "NullReferenceException;"
                Catch e As ArgumentNullException
                    argunull = e
                    NetClient = "ArgumentNullException;"
                Catch e As SocketException
                    argunull = e
                    NetClient = "SocketException;"
                End Try
            Catch e As SocketException
                argunull = e
                NetClient = "SocketException;"
            End Try
        End Function

    End Class
End Namespace

Ich starte den Server und frage ihn dann mit einem Timer ab Geht nicht also habe ich auch schon mit einem Code Probiert der die form einfrieren läst geht aber auch nicht bei beiden hat der das prob das die hier stehen bleiben (Host = Listener.AcceptTcpClient()) trotz das sich ein Client einwählt und auch ein String schickt
 
Ja und Nein

wenn ich mich mit dem Client einlogge dann schickt der einen String (Kommt nichts an) danach wartet der auf Rückgabe und wenn ich dann den Server ausmache dann kommt ein SocketException Fehler also nach dem moto die Verbindung wurde vorzeitig beendet. Der Server bleibt beim debug bei Host = Listener.AcceptTcpClient() stehen ka ob das dir was sagt
 
Hi ich bin es noch mal ich habe das Problem jetzt über die Nettzwerg beisiele von Microsoft gelöst
ich habe dann den Code in mein prog übernommen und zwar in ein Modul anstatt in die form Funktioniert auch ganz gut
habe jetzt nur das Problem das der mir nichts ausgibt aber auf allen anderen Clients schon

könnte mir da bitte einer helfen
 
Hey,

also "er" bleibt deswegen bei
Code:
Socket.Accept();
"hängen", weil das eine blockierende Methode ist, diese lagert man i.d.R. aus, z.B. in einen anderen Thread.

Dein Problem mit dem Datenempfang wird eventuell daran liegen, dass das Serverprogramm auf Deinem PC läuft und die Ports, die der Server benutzt auch Deine sind, aber das ist nur eine Vermutung, weil das aus dem Codeschnipsel leider nicht hervorgeht.


MfG VScan
 
Zurück