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
#include <GUIConstants.au3>
#include <array.au3>
#include <string.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
OnAutoItExitRegister ("_exit")
Dim $szIPADDRESS = @IPAddress2
Dim $nPORT = 33892
Dim $ConnectedSocket = -1
const $myIP = @IPAddress2
TCPStartup ()
$MainSocket = TCPListen ($szIPADDRESS, $nPORT,99999)
If $MainSocket = -1 Then Exit
#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 ###
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
$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)
#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:
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!
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
EndIf
[/autoit] [autoit][/autoit] [autoit]#region Zerlegen des Textes -> Absätze werden wieder zusammengefügt
$recv1=_StringExplode($recv,"##enter##")
$recv=""
For $i=0 To UBound($recv1)-1
$recv=$recv1[$i]&@CRLF&$recv
Next
GUICtrlSetData($edit, $recv) ;Wenn der Text wieder fertig zusammengefügt wurde, wird er in die GUI editiert ...
WEnd
#endregion
Func _exit() ; -> Siehe OnAutoItExitRegister ("_exit")
TCPShutDown()
EndFunc
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
Source Server:
Spoiler anzeigen
#include <GUIConstants.au3>
#include <array.au3>
#include <string.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
OnAutoItExitRegister("_exit")
Dim $szIPADDRESS = @IPAddress2
Dim $nPORT = 33891
Dim $ConnectedSocket = -1
TCPStartUp()
$MainSocket = TCPListen($szIPADDRESS, $nPORT)
If $MainSocket = -1 Then Exit
Dim $GOOEY = GUICreate("KM - Server (IP: " & $szIPADDRESS & ")",550,400,@DesktopWidth-555,0)
Dim $edit = GUICtrlCreateEdit("",10,10,530,380)
GUISetState()
while 1
Do
$ConnectedSocket = TCPAccept($MainSocket)
Until $ConnectedSocket <> -1
$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))
For $i=0 to 25
If StringLen(Iniread(@DesktopDir,$i,"send",""))<8 Then
$r=$i
ExitLoop
EndIf
Next
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
Func _exit()
TCPShutDown()
EndFunc
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!")
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
Den Server hat ein Freund gemacht, er meint an den Fehlermeldungen ist der Client Schuld ...
Hoffe jemand kann helfen!