An lokalen Port senden und mit Telnet empfangen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Dodo.

    An lokalen Port senden und mit Telnet empfangen

    Hallo Leute

    Manchmal weis man die einfachsten Dinge nicht mehr.
    Der erste PC hat die IP 192.1681.2 und der Zweite 192.168.1.4. Am zweiten starte ich in der Konsole Telnet 192.168.1.2 7000 auf! Telnet horcht also jetzt am Port 7000 am ersten PC, richtig?
    Nun zum Problem: Ich möchte nun am ersten PC mit VB einen Button haben der eine Nachricht sendet. So, dass ich es in der Telnet-Konsole lesen kann. Ich muss doch also sicher an localhost:7000 senden?

    Wer hilft mir??
    Besten Dank an alle Antworten
    Wenn du an den 2. PC senden willst, wieso dan localhost?? localhost ist der Rechner auf dem dein VB Programm läuft also x.x.1.2 wenn du an localhost sendest dann müsstest auch auf diesem Rechner die Telnet Konsole aufmachen.

    Da aber die Konsole ein Client ist muss also x.x.1.2 ein Server sein der auf eingehende Verbindungen an Port 7000 wartet.
    Zuerst musst du also den Server starten und erst dann am 2. PC die Konsole, weil sie ansonsten gleich wieder geschlossen wird, da ja keine Rückmeldung vom PC x.x.1.2 auf Port 7000 kommt.
    Genau so möchte ich es haben! Hat natürlich auch einen tieferen Sinn. Wird aber zu lang bis ich alles erklärt habe. Der Server wird am ersten PC gestartet und danach horcht telnet am 2. PC die Verbindung auf Port 7000 ab! In allen Beispielen (meistens TCP-Chats) habe ich aber nicht begriffen, wie der Server sendet. Das Ziel ist wirklich, dass ich am 1 PC auf einen Button klicke, der sendet z.b. "Hallo Welt" an den lokalen Port 7000 und am 2. PC kann ich per telnet die Nachricht lesen. Vielleicht kann mir jemand ein Beispiel posten.

    Danke zum voraus!
    Die Beispiele sind in den Tutorials bereits drin, da steht irgendwo das der Server auf Verbindungen wartet AcceptClients() oder so ähnlich, danach wird meist der NetworkStream ausgelesen und mit diesem NetworkStream kannst du nun dein Hello World reinschreiben.

    Hier hast du alles was du brauchst

    [VB.NET] Simples, funktionierendes Beispiel einer TCP/IP-Verbindung zwischen zwei Rechnern.

    du benötigst natürlich NUR den ersten Code teil für den Server, der Client ist ja Telnet am zweiten Rechner.
    Ich spüre es an meinen Kniescheiben, dass wir auf dem richtigen Weg sind, aber:

    Ich habs nun versucht! Den Button anzulegen war Anfängersache, aber klappen tuts trotzdem nicht! Nach meinem Verständnis starte ich das Debugging des Serverscodes auf dem ersten PC (Port 8000). Jetzt sollte ich auf dem zweiten PC Telnet starten können und horche Port 8000 ab! Es kommt aber bei Telnet nach einiger Zeit die Meldung, dass der die Verbindung mit dem Host nicht hergestellt werden konnte. Verbindungsfehler auf Port 8000. Anti-Virus und Firewalls sind ausgeschaltet! Was läuft hier falsch?

    weratv schrieb:

    Hallo Leute


    Hi auch :)


    weratv schrieb:


    Am zweiten starte ich in der Konsole Telnet 192.168.1.2 7000 auf! Telnet horcht also jetzt am Port 7000 am ersten PC, richtig?

    Telnet horcht nicht am Port dort, sondern es versucht zu verbinden.

    weratv schrieb:


    Nun zum Problem: Ich möchte nun am ersten PC mit VB einen Button haben der eine Nachricht sendet. So, dass ich es in der Telnet-Konsole lesen kann. Ich muss doch also sicher an localhost:7000 senden?


    Du musst nicht an LocalHost Port 7000 senden, sondern dort "ABHören", und bei Verbindungsversuch annehmen.
    Dann hast du eine Verbindung hergestellt.

    Du brauchst also theoretisch ein Socket.
    VB.NET machts dir da relativ einfach.
    Du erstellst ein Objekt vom Typ TCPListener (zu finden unter System.Net wenn ich mich nicht irre)
    Diesem lässt du nun (idealer weise asynchron) am Port 7000 auf deiner NIC hören.
    Die Methode heisst direkt ".Listen"
    Will sich ein CLient (also PC2 über Telnet verbinden) dann benötigst du nur noch einen TCP Client und ein Networkstreamobjekt.
    Über TCPListener.AcceptCLient weisst du deinen Objekten Stream und TCPCLient den Client zu.
    Nun kannst du direkt in den NetworkStream , oder über den für Telnet sicher geeigneten Streamwriter/reader Daten senden und empfangen.

    Bei weiteren Fragen, kann ich dir sicher bei deinen Codeversuchen behilflich sein.
    Das ist meine Signatur und sie wird wunderbar sein!
    War schon mal sehr hilfreich!! Im ersten Teil des Beispiels von

    [VB.NET] Simples, funktionierendes Beispiel einer TCP/IP-Verbindung zwischen zwei Rechnern.


    ist genau ein solcher Server beschrieben! Beim Starten an PC1 horcht also der Server lokal an Port 8000 Verbindungsanfragen aller IPs ab und würde diese automatisch verbinden, oder? Somit müsste also telnet am 2 PC (Befehl: telnet 192.168.1.2 8000) verbinden. Tut es aber nicht. Die Fehlermeldung "Es konnte keine Verbindung zu Host hergestellt werden" kommt nach ca. 10 Sekunden. Was ist hier falsch?
    Jetzt verbindet sich Telnet auf einmal!! Weiss der Teufel wie ich das hingekriegt habe. Telnet wird aber schwarz! Ausser dem blinkenden Cursor ist kein Prompt zu sehen oder so! Ist das normal? Wie kann ich jetzt an diesem Beispiel einen Text senden der dann in Telnet angezeigt wird?

    Ich geh jetzt mal pennen, vielleicht hilft's! :D
    Steht im Tutorial mit drin, NetworkStream einen StreamWriter zuordnen und in den StreamWriter text eintragen.

    vlt. zeigst du uns mal dein Code, damit könnten wir dir viel schneller helfen und auch wenn ihn zum großteil nur kopiert haben magst, selbst da können sich Fehler einschleichen und so dümpeln wir nur im Nebel und können erahnen was du evtl machst. Mit einem Code könnte man spezifischer sagen mache dies und das hier und dort.
    Ich habe nun wieder einen ganzen Tag verbracht und versucht es hinzukriegen (man ist ja schliesslich hartnäckig und stur), es funktioniert einfach nicht! Ich weiss, dass ich ganz nahe dran bin.

    Hier mal mein Code:

    Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Net
    4. Public Class Form1
    5. Dim stream As NetworkStream
    6. Dim streamw As StreamWriter
    7. Dim streamr As StreamReader
    8. Dim server As TcpListener
    9. Dim client As New TcpClientDim ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8000)
    10. Dim t As New Threading.Thread(AddressOf Main)Sub Main()
    11. Tryserver = New TcpListener(ipendpoint)
    12. server.Start()
    13. client = server.AcceptTcpClient
    14. stream = client.GetStreamstreamr = New StreamReader(stream)
    15. streamw = New StreamWriter(stream)
    16. While TrueSelect Case streamr.ReadLine
    17. Case "Connect?"MessageBox.Show("Yes, connected!")
    18. End Select
    19. End While
    20. CatchMessageBox.Show("Socket-Fehler.")
    21. Button1.Text = "Start"
    22. End Try
    23. End SubPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    24. If Button1.Text = "Start" Then
    25. t.Start()
    26. Button1.Text = "Stop"
    27. Else
    28. client.Close()
    29. streamr.Close()
    30. streamw.Close()
    31. stream.Close()
    32. Button1.Text = "Start"
    33. End If
    34. End SubPrivate Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    35. Try
    36. streamr = New StreamReader(stream)
    37. streamw = New StreamWriter(stream)
    38. While TrueSelect Case streamr.ReadLine
    39. Case "Connect?"MessageBox.Show("Yes, connected!")
    40. End Select
    41. End While
    42. CatchMessageBox.Show("Socket-Fehler.")
    43. End TryEnd Sub
    44. End Class


    Habe zwei Buttons angelegt! Der Eine zum Server starten und der Andere zum Text senden! Wo liegt das Problem?? Das kann doch nicht so schwer sein!
    PS: Hey Dodo, was machst Du um 05.30 Uhr auf dieser Welt? ;( Ich weiss es! Du konntest wegen meinem Problem auch nicht schlafen!! :thumbsup:
    Eure Hilfe ist sehr nett und wird hoffentlich auch weiteren verzweifelten Usern zu einer Lösung verhelfen!
    Ich stehe um 5:30 auf und war schon etwas früher wach wegen meiner Katze xD

    Also Formatiere erstmal deinen Code neu in Zeile 14 fehlt ein Zeilenumbruch und an einigen anderen Stellen auch. Dann nutze nicht den

    Quellcode

    1. BBCode sondern den [code=vbnet] BBCode, weil dann wird alles noch schön übersichtlich eingefärbt wie in der VB IDE, so mag ich mir den Code nicht ansehen weil es zuviel Anstrengung kostet.
    2. Edit: Ich habe auch mal ein Server und Client aus dem hier vorgestellten Tutorial gemacht und eben mal mit Telnet ausgetestet und es funktioniert perfekt
    3. [vb]Imports System.Net.Sockets
    4. Imports System.IO
    5. Imports System.Net
    6. Public Class Form1
    7. Dim stream As NetworkStream
    8. Dim streamw As StreamWriter
    9. Dim streamr As StreamReader
    10. Dim server As TcpListener
    11. Dim client As New TcpClient
    12. Dim ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 10002)
    13. Dim WithEvents bw As New System.ComponentModel.BackgroundWorker
    14. Private Delegate Sub DoUpdate(ByVal Text As String)
    15. Private Delegate Sub StopServer()
    16. Private Sub bw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork
    17. Try
    18. server = New TcpListener(ipendpoint)
    19. server.Start()
    20. client = server.AcceptTcpClient
    21. stream = client.GetStream
    22. streamr = New StreamReader(stream)
    23. streamw = New StreamWriter(stream)
    24. Dim sLine As String = streamr.ReadLine
    25. While True
    26. sLine = streamr.ReadLine
    27. If Not sLine = String.Empty Then Me.Invoke(New DoUpdate(AddressOf TextChange), sLine)
    28. If bw.CancellationPending Then
    29. Me.Invoke(New StopServer(AddressOf ServerStop))
    30. Exit Sub
    31. End If
    32. End While
    33. Catch ex As Exception
    34. MessageBox.Show(ex.Message)
    35. Me.Invoke(New StopServer(AddressOf ServerStop))
    36. End Try
    37. End Sub
    38. Private Sub TextChange(ByVal Text As String)
    39. TextBox1.Text &= Text & vbNewLine
    40. End Sub
    41. Private Sub ServerStop()
    42. client.Close()
    43. streamr.Close()
    44. streamw.Close()
    45. stream.Close()
    46. Button1.Text = "Start"
    47. End Sub
    48. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    49. If Button1.Text = "Start" Then
    50. bw.WorkerSupportsCancellation = True
    51. bw.RunWorkerAsync()
    52. Button1.Text = "Stop"
    53. Else
    54. bw.CancelAsync()
    55. Button1.Text = "Start"
    56. End If
    57. End Sub
    58. End Class


    Der Code ist nicht ganz sauber, aber mir ging es primär einfach nur darum etwas zu lernen und deswegen habe ich den Code so umgeschrieben das er das macht was ich wollte.

    Du startest also den Server in VB und danach öffnest du z.B. Putty und connectest auf 127.0.0.1 Port 10002, wenn die Verbindung besteht kannste in Putty etwas schreiben und beim Server in der Textbox erscheint das geschriebene dann.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dodo“ ()

    Soso, die Katze wars!!!!!! :thumbup:

    Ich habe Dein Code ausprobiert und funktioniert einwandfrei. Dies habe ich schon mal hingekriegt!

    Das Problem ist aber, dass ich danach vom Server etwas senden will und in Putty oder Telnet will ich dan den Text sehen! WO muss ich WAS einsetzen??
    Na in den Stream natürlich

    Die zuweisung ist hier

    VB.NET-Quellcode

    1. streamw = New StreamWriter(stream)


    du solltest dich schon ein klein wenig damit auseinander setzten und verstehen was dort überhaupt passiert, wie man nun etwas in den NetworkStream sendet sollte EIGENTLICH nicht das Problem sein bei so einem übersichtlichen Code und die Klassen / Variablen sind ja eigentlich auch selbsterklärend oder?
    So, ich hab's! Das hätte ich nie alleine herausgekriegt! Du hast mir sehr viel geholfen, schade nicht bis zum Schluss. Hoffentlich bringt den Code nun Andere weiter!

    Beim starten des Servers wird an der lokalen Netzwerkkarte den Port 7000 abgehört! Will sich ein Client nun verbinden (natürlich auch auf Port 7000), so akzeptiert der Server dies und stellt automatisch eine Verbindung her. Wenn der Client nun einen Text eingibt und sendet, wird dieser beim Server empfangen, in der Textbox angezeigt und auch wieder als Bestätigung an den Client zurückgesendet!
    Im Anhang habt ihr den Code!
    Das wars!

    Besten Dank an Alle, besonders an Dodo und Gallus!

    Tschüssilein....
    Dateien
    Hi all!

    Habe noch ein Problem!!!

    Es könnte ja sein, dass am PC vom Client jemand über das Kabel stolpert während er mit dem Server verbunden ist. Was passiert dann genau? Merkt der Server das er seinen Client verloren hat, oder wie? Schliesst der Server dann seine Verbindung? Wie kann man das im Code absichern?

    Danke zum voraus für Antworten!
    Der Server merkt glaube ich nicht zwangsläufig das eine Verbindung unterbrochen wurde. Der Client jedoch schon. Ansonsten einfach mal testen wenn mit Telnet eine Verbindung aufgebuat hast und dann das VB Programm beendest würde Putty bei mir "Connection lost" angeben, was beim Server passiert wenn Putty schließt müsste man austesten, googlen und mal bei MSDN im Namespace nachsehen ob es da ggf. eine Timeout Variable oder ähnliches gibt.

    Edit: codeproject.com/KB/dotnet/DetectSocketConectionLoss.aspx