[TCP] Zu 90% eine Fehlermeldung

  • Hi,
    Da mir Autobert und Homer das letzte Mal gut helfen konnten, hier wieder einmal ein anscheinend fehlerhaftes Script. Es geht um einen TCP - Clienten und Server.

    Problem: Client erhält zu 90 % einen leeren String (Auch wenn Client und Server auf dem selben Computer laufen !!!). Source des Clienten:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <array.au3>
    #include <string.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    OnAutoItExitRegister ("_exit")
    Dim $szIPADDRESS = @IPAddress2
    Dim $nPORT = 33892
    Dim $ConnectedSocket = -1
    const $myIP = @IPAddress2

    [/autoit] [autoit][/autoit] [autoit]

    TCPStartup ()
    $MainSocket = TCPListen ($szIPADDRESS, $nPORT,99999)
    If $MainSocket = -1 Then Exit

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("[KM] Onlinezone", 786, 510, 518, 136)
    $edit = GUICtrlCreateEdit("", 8, 8, 473, 465)
    GUICtrlSetData(-1, "")
    $Edit2 = GUICtrlCreateEdit("", 488, 8, 289, 465)
    GUICtrlSetData(-1, "")
    $Input1 = GUICtrlCreateInput("Text", 8, 480, 385, 21)
    $Button1 = GUICtrlCreateButton("Senden", 400, 480, 81, 25)
    $Button2 = GUICtrlCreateButton("Status übermitteln", 488, 480, 153, 25)
    $Button3 = GUICtrlCreateButton("Verlassen", 648, 480, 129, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    while 1

    [/autoit] [autoit][/autoit] [autoit]

    Do

    [/autoit] [autoit][/autoit] [autoit]

    switch GUIGetMsg()
    case $GUI_EVENT_CLOSE
    Exit
    case $Button3
    Exit
    case $Button2
    MsgBox (0,"Ausständig","Diese Funktion muss erst eingebaut werden!")
    case $Button1
    clientsendtoserver(GuiCtrlRead($Input1)) ; -> Ausgelesener Text wird an die Funktion weitergegeben ...
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    $ConnectedSocket = TCPAccept($MainSocket)

    [/autoit] [autoit][/autoit] [autoit]

    Until $ConnectedSocket <> -1

    [/autoit] [autoit][/autoit] [autoit]

    $recv = TCPRecv( $ConnectedSocket, 99999 )
    TCPCloseSocket( $ConnectedSocket )
    if $recv="" Then
    $recv="<Ein leeres oder fehlerhaftes Packet wurde vom Server gesendet.>"&@CRLF&"Admin: Bitte leite dieses Problem weiter!"&@CRLF&GuiCtrlRead($edit)

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    Über diesem Text wird eine Fehlermeldung durch die angekommene, leider leere Nachricht ersetzt. Leider kommt diese Fehlermeldung zu 90 Prozent.
    Hier die Log-Einträge seitens des Servers:

    [/autoit] [autoit][/autoit] [autoit]

    Es wurde ein Packet mit dem Inhalt 'Text' empfangen. Absender: 5.135.32.10
    Nachricht gespeichert! Funktion zum senden der aktuellen Daten an die Clienten wird aufgerufen ...
    Der Server wird nun die aktuellen Daten an den Client übermitteln!
    Der Server verbindet sich mit 5.135.32.10 ...
    Erfolgreich mit dem Clienten verbunden!
    Der Text '##enter##5.135.32.10 : Text' wurde an 5.135.32.10 gesendet! 27 Bytes sind angekommen!
    Die Funktion zum Senden der aktuellen Daten wurde ausgeführt. Warte auf weitere Befehle!

    [/autoit] [autoit][/autoit] [autoit]

    Das beweist, dass der Text erfolgreich abgeschickt wurde. Angeblich ist er sogar angekommen ...

    [/autoit] [autoit][/autoit] [autoit]

    Könnt ihr mir sagen, warum ich oft die Fehlermeldung bekomme? Warum bekomme ich einen leeren Text?
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    #region Zerlegen des Textes -> Absätze werden wieder zusammengefügt
    $recv1=_StringExplode($recv,"##enter##")
    $recv=""

    [/autoit] [autoit][/autoit] [autoit]

    For $i=0 To UBound($recv1)-1
    $recv=$recv1[$i]&@CRLF&$recv
    Next

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($edit, $recv) ;Wenn der Text wieder fertig zusammengefügt wurde, wird er in die GUI editiert ...
    WEnd
    #endregion

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit() ; -> Siehe OnAutoItExitRegister ("_exit")
    TCPShutDown()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func clientsendtoserver($szData)
    Dim $szIPADDRESS = "5.135.32.10" ; -> Server IP (Hamachi)
    Dim $nPORT = 33891 ; -> Serverport
    Dim $ConnectedSocket = -1
    $szData=$szData&"##//##"&$myIP ; Am Server wird anhand dem ##//## erkannt, wo die IP anfängt ...
    $ConnectedSocket = TCPConnect($szIPADDRESS,$nPORT)
    TCPSend($ConnectedSocket,$szData)
    If @error Then
    MsgBox(0,"Fehler","Text konnte nicht gesendet werden. Fehlercode : "&@error)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Source Server:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <array.au3>
    #include <string.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    OnAutoItExitRegister("_exit")
    Dim $szIPADDRESS = @IPAddress2
    Dim $nPORT = 33891
    Dim $ConnectedSocket = -1
    TCPStartUp()
    $MainSocket = TCPListen($szIPADDRESS, $nPORT)
    If $MainSocket = -1 Then Exit

    [/autoit] [autoit][/autoit] [autoit]

    Dim $GOOEY = GUICreate("KM - Server (IP: " & $szIPADDRESS & ")",550,400,@DesktopWidth-555,0)
    Dim $edit = GUICtrlCreateEdit("",10,10,530,380)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    while 1

    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1

    [/autoit] [autoit][/autoit] [autoit]

    $recv = TCPRecv( $ConnectedSocket, 2048 )
    TCPCloseSocket( $ConnectedSocket )
    if $recv="" Then
    _KMLogConsole("Ein unbekannter Client schickte ein leeres Packet!")
    $recv="<Ein Client hat ein leeres oder fehlerhaftes Packet geschickt!>##//##Errorlog:"
    EndIf
    $IP_AcceptedR=_StringExplode($recv,"##//##")
    $IP_Accepted=$IP_AcceptedR[1]
    $recv=$IP_AcceptedR[0]
    _KMLogConsole("Es wurde ein Packet mit dem Inhalt '"&$recv&"' empfangen. Absender: "&$IP_Accepted)
    GUICtrlSetData($edit, $IP_Accepted & " : " & $recv & @CRLF & GUICtrlRead($edit))

    [/autoit] [autoit][/autoit] [autoit]

    For $i=0 to 25
    If StringLen(Iniread(@DesktopDir,$i,"send",""))<8 Then
    $r=$i
    ExitLoop
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    IniWrite(@DesktopDir&"\KMsyserr.ini",$r,"send",$IP_Accepted)
    IniWrite(@DesktopDir&"\KMsyserr.ini","client","send",IniRead(@DesktopDir&"\KMsyserr.ini","client","send","")&"##enter##"&$IP_Accepted&" : "&$recv)
    _KMLogConsole("Nachricht gespeichert! Funktion zum senden der aktuellen Daten an die Clienten wird aufgerufen ...")
    ClientSendBack()

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    TCPShutDown()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func ClientSendBack()
    Dim $nPORT = 33892
    Dim $ConnectedSocket = -1
    if FileGetSize(@DesktopDir&"\KMsyserr.ini")>3000 Then IniWrite(@DesktopDir&"\KMsyserr.ini","client","send",StringTrimLeft(IniRead(@DesktopDir&"\KMsyserr.ini","client","send",""),75))
    _KMLogConsole("Der Server wird nun die aktuellen Daten an den Client übermitteln!")

    [/autoit] [autoit][/autoit] [autoit]

    For $a=0 to 25
    $uIP=IniRead(@DesktopDir&"\KMsyserr.ini",$a,"send","")
    if $uIP<>"" Then
    $ConnectedSocket = TCPConnect($uIP,$nPORT)
    _KMLogConsole("Der Server verbindet sich mit "&$uIP&" ...")
    If @error Then
    _KMLogConsole("Verbinden mit dem Clienten war nicht möglich! User ist vermutlich offline ... User wird aus der Liste gestrichen!")
    IniWrite(@DesktopDir&"\KMsyserr.ini",$a,"send","")
    Else
    _KMLogConsole("Erfolgreich mit dem Clienten verbunden!")
    $szData = IniRead(@DesktopDir&"\KMsyserr.ini","client","send","")
    If @error Or $szData = "" Then GuiCtrlSetData($Edit1,GUiCtrlRead($Edit1)&@CRLF&"Der Server gibt an, dass ein leeres Packet gesendet werden soll!")
    $bytes = TCPSend($ConnectedSocket,$szData)
    _KMLogConsole("Der Text '"&$szData&"' wurde an"&$uIP&" gesendet! "&$bytes&" Bytes sind angekommen!")
    If @error Then _KMLogConsole("Bei "&$uIP&" ist nichts angekommen! Da die Verbindung jedoch erfolgreich war, scheint es Probleme auf seitens des Users zu geben!")
    EndIf
    EndIf
    Next
    _KMLogConsole("Die Funktion zum senden der aktuellen Daten wurde ausgeführt. Warte auf weitere Befehle!")
    EndFunc

    [/autoit]


    Den Server hat ein Freund gemacht, er meint an den Fehlermeldungen ist der Client Schuld ...

    Hoffe jemand kann helfen!

  • Du must Tcprecv in einer Schleife ausführen:

    [autoit]

    Do
    $recv=Tcprecv($ConnectedSocket,2000)
    Until $recv <> ""

    [/autoit]

    Außerdem scheinst du das Client und Server system nicht so ganz verstanden zu haben,

    bei dir ist der "Client" ebenfalls ein Server weil du immer Tcpaccept benutzt, beim Client müsstest du nur Tcpconnect benutzt

    Einmal editiert, zuletzt von sumsum (19. April 2011 um 21:28)

  • Danke, ich wusste nicht, dass ich TcpRecv in einer Schleife abfragen muss.

    In Client und Server kenne ich mich aus, ich weiß, dass beides beides ist, das ist dazu gedacht, dass der Server dem Clienten Aktualisierungen schicken kann, wenn ein anderer User etwas schreibt ...