Socket Client problem beim Empfangen

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von haufe.

    Socket Client problem beim Empfangen

    Hallo

    ich habe hier einen Socket Client mit dem ich auf meinem Perl-Server zugreife.

    Mein Problem ist das der Client beim Senden auch Empfangen will, das zum Absturz der Client führt,

    Der Client Code:

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Net.Sockets
    3. Imports System.Text
    4. Public Class Form1
    5. Dim remoteIPAddress As IPAddress
    6. Dim ep As IPEndPoint
    7. Dim tnSocket As Socket
    8. Dim ip As String
    9. Dim port As String
    10. Private Sub VerbindenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VerbindenToolStripMenuItem.Click
    11. If ip = "" Then
    12. ip = InputBox("Bitte die ip angeben")
    13. port = InputBox("Bitte die port angeben")
    14. End If
    15. If VerbindenToolStripMenuItem.Text = "Trennen" Then
    16. tnSocket.Close()
    17. remoteIPAddress = Nothing
    18. ep = Nothing
    19. tnSocket = Nothing
    20. VerbindenToolStripMenuItem.Text = "Verbinden"
    21. Else
    22. SendCommands(ip, port)
    23. End If
    24. End Sub
    25. Private Sub SendCommands(ByVal PIPAddress As String, ByVal PPort As String)
    26. Dim RecvString As String = String.Empty
    27. Dim NumBytes As Integer = 0
    28. remoteIPAddress = IPAddress.Parse(PIPAddress.Trim)
    29. ep = New IPEndPoint(remoteIPAddress, CType(PPort.Trim, Integer))
    30. tnSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    31. Dim RecvBytes(255) As [Byte]
    32. Try
    33. tnSocket.Connect(ep)
    34. Catch oEX As SocketException
    35. Exit Sub
    36. End Try
    37. Try
    38. If tnSocket.Connected Then
    39. VerbindenToolStripMenuItem.Text = "Trennen"
    40. Do
    41. NumBytes = tnSocket.Receive(RecvBytes, RecvBytes.Length, 0)
    42. RecvString = RecvString + Encoding.ASCII.GetString(RecvBytes, 0, NumBytes)
    43. Loop While NumBytes = 256
    44. ListBox1.Items.Add(RecvString)
    45. ' -------------------------------------------------------------------
    46. Wait(1000)
    47. End If
    48. Catch oEX As Exception
    49. End Try
    50. End Sub
    51. Private Sub Wait(ByVal PMillseconds As Integer)
    52. Dim TimeNow As DateTime
    53. Dim TimeEnd As DateTime
    54. Dim StopFlag As Boolean
    55. TimeEnd = Now()
    56. TimeEnd = TimeEnd.AddMilliseconds(PMillseconds)
    57. StopFlag = False
    58. While Not StopFlag
    59. TimeNow = Now()
    60. If TimeNow > TimeEnd Then
    61. StopFlag = True
    62. End If
    63. Application.DoEvents()
    64. End While
    65. TimeNow = Nothing
    66. TimeEnd = Nothing
    67. End Sub
    68. Sub send(ByVal Command As String)
    69. ' Dim RecvString As String = String.Empty
    70. Dim NumBytes As Integer = 0
    71. Dim SendBytes As [Byte]() = Encoding.ASCII.GetBytes(Command & vbCrLf)
    72. Dim RecvBytes(255) As [Byte]
    73. Try
    74. tnSocket.Send(SendBytes, SendBytes.Length, SocketFlags.None)
    75. ' Do
    76. 'Wait(2000)
    77. 'NumBytes = tnSocket.Receive(RecvBytes, RecvBytes.Length, 0)
    78. ' RecvString = RecvString + Encoding.ASCII.GetString(RecvBytes, 0, NumBytes)
    79. ' Loop While NumBytes = 128
    80. 'ListBox1.Items.Add(RecvString)
    81. Catch ex As Exception
    82. MsgBox("Keine Verbindung")
    83. End Try
    84. End Sub
    85. Private Sub cmdSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSend.Click
    86. send(sendtxt.Text)
    87. End Sub
    88. End Class



    Der Perl Server:

    Quellcode

    1. use IO::Socket;
    2. use Net::hostent;
    3. $PORT = 8177;
    4. $server = IO::Socket::INET->new( Proto => 'tcp',
    5. LocalPort => $PORT,
    6. Listen => SOMAXCONN,
    7. Reuse => 1);
    8. die "can't setup server" unless $server;
    9. print "Waiting for connection...\n";
    10. while ($client = $server->accept()) {
    11. $client->autoflush(1);
    12. print $client "Welcome to Server!\n\n";
    13. $hostinfo = gethostbyaddr($client->peeraddr);
    14. printf "[Connect from %s]\n", $hostinfo->name || $client->peerhost;
    15. #print "Connection received from $client->peeraddr\n";
    16. while(<$client>) { print }
    17. while(<client>){print $client "Anfrage wird bearbeitet!\n\n";}
    18. print $client "Welcome to Server!\n\n";
    19. #$message = <$client>;
    20. # print "Incoming message: $message\n";
    21. }
    22. #close $client;

    nehme ich den Teil raus:

    VB.NET-Quellcode

    1. ' Do
    2. 'Wait(2000)
    3. 'NumBytes = tnSocket.Receive(RecvBytes, RecvBytes.Length, 0)
    4. ' RecvString = RecvString + Encoding.ASCII.GetString(RecvBytes, 0, NumBytes)
    5. ' Loop While NumBytes = 128
    6. 'ListBox1.Items.Add(RecvString)


    geht alles Bestens.

    Kann ich irgend wie eine Schleife einbauen, so das er nur Encoded wemm auch Daten da sind? oder habe ich wo anderst den Fehler ??


    MfG
    Haufe

    Edit : Der Fehler Liegt in der Zeile

    VB.NET-Quellcode

    1. NumBytes = tnSocket.Receive(RecvBytes, RecvBytes.Length, 0)
    ähh? wasn das :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „haufe“ ()

    so hab mal noch am server rumgemacht und jetzt läuft der client, da der server bei jeder anfrage eine antwort gibt.
    Meine Frage:

    wie kann ich dem client sagen das er immer schauen soll ob der server ne nachricht sendet?, falls ja, soll er es posten.
    momentan ruft er ja nur ne nachricht ab wen er eine sendet

    Bitte um Hilfe.

    Danke
    Der Code für den Server PERL:

    Quellcode

    1. use strict;
    2. use warnings;
    3. use Net::hostent;
    4. use IO::Socket::INET;
    5. use IO::Select;
    6. # Listensocket erstellen
    7. my $server = IO::Socket::INET->new(
    8. LocalPort => 2005,
    9. type => SOCK_STREAM,
    10. Reuse => 1,
    11. Listen => 10
    12. ) or die "Server läuft nicht: $@\n";
    13. my $select = IO::Select->new($server);
    14. my $hostinfo;
    15. my $client;
    16. my $name;
    17. # warten, bis ein Client sich anmeldet, oder
    18. # man von bereits angemeldeten Clients lesen kann
    19. my $answer = 0;
    20. while (my @readable = $select->can_read) {
    21. for my $socket (@readable) {
    22. if ($socket == $server) { # wenn der Socket gleich dem Listensocket ist
    23. # Create a new socket
    24. $client = $socket->accept; # kehrt direkt zurück
    25. $hostinfo = gethostbyaddr($client->peeraddr);
    26. $name = $hostinfo->name || $client->peerhost;
    27. print "[$name] connects\n";
    28. $select->add($client); # in Select-Objekt aufnehmen
    29. }
    30. else { # sonst
    31. my $line = $socket->getline; # von Socket lesen
    32. if (defined $line) { # kein Fehler?
    33. $line =~ s!\r?\n$!!g; # Zeilenumbruch entfernen
    34. if (lc($line) eq 'quit') { # falls der Client beenden will
    35. print "Client quits\n";
    36. delete_socket($select, $socket);
    37. }
    38. else { # ansonsten, Message ausgeben
    39. # $hostinfo = gethostbyaddr($client->peeraddr);
    40. print "$name says: [$line] \n" ;
    41. # print "Client says: \n";
    42. $socket->print("#".$answer++."\n");
    43. }
    44. }
    45. else {
    46. print "$name disconect\n";
    47. delete_socket($select, $socket);
    48. }
    49. }
    50. }
    51. }
    52. # kleine Routine, zum Zerstören des Sockets
    53. sub delete_socket {
    54. my ($sel, $sock) = @_;
    55. $sel->remove($sock); # Socket aus Select-Objekt entfernen
    56. $sock->close(); # Socket schliessen
    57. }

    OK nach Stunden Googeln habe ich herausgefunden das es 2 MEthoden bei Clienten gibt.
    1.]Syncron
    2.]Asyncron

    Deswegen geht auch mein Client nicht, da ich ein Asyncronen Server habe.
    Einen Async Client hatte ich gleich, er ist fehlerhaft, deswegen mache ich einen neuen Thread
    MfG
    Haufe
    ähh? wasn das :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „haufe“ ()