Hilfe bei Tcp senden von datein

10/03/2013 13:47 Kirajashi#1
Hallo liebes Epvp System,

ich habe nun eine menge über Tcp bei Autoit herausgefudnen und da ich und ein Paar kollegen immer wieder Datein senden wollen und müssen habe ich mir gedacht das geht doch per Tcp in den man den Bynaren code ausliest und an Punkt a wieder zusammenpusselt.

Client:
[Only registered and activated users can see links. Click Here To Register...]

so nun das Problem;
Ersten test gemacht mit Txt datein Alles Super dachte ich mir :rolleyes::rolleyes:
doch bei Bildern klappte es nicht also geguckt und geguckt :confused::confused: und dan hab ich mal bei den Eigenschaften geguckt,es sind immer 2 Kb strings mehr geht nicht :(:(:(:( also,ich möchte nun den Eingelesen Code in 2kb stücken Trennen und die alle Einzelnt an den Server schicken.

Client Send Code:
Code:

Local $var = FileOpenDialog("Select a File to Send to Server", @DesktopDir & "\", "All Files(*.*)", 1 + 4)
CmdToServer("FileSendToServer")
MsgBox(0,"",$var)
Local $var2= InputBox("Destilation","Where does the server Extract the File?")
CmdToServer($var2)
MsgBox(0,"",$var2)
Local $var3= FileRead(FileOpen($var))
CmdToServer($var3)
Servercode:
Code:
#include <GUIConstants.au3>
#RequireAdmin
$ServerIP = @IPAddress1
$Port = 33891
Global $filesendvar=0
Global $filesendvar2=0
Global $filesendvar3=0
TCPStartup()
$MainSocket = TCPListen($ServerIP, $Port)
if $MainSocket = -1 Then Exit

$ConnectedSocket = -1

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

While 1
        $recv = TCPRecv($ConnectedSocket, 2048)

        if $recv <> "" Then
                _CommandToAction($recv)
        EndIf
WEnd

if $ConnectedSocket     <> -1 Then TCPCloseSocket($ConnectedSocket)
TCPShutdown()


Func _CommandToAction($command)
		if $filesendvar=1 Then
			if $filesendvar2=1 Then
				FileWrite($filesendvar3,$command)
				MsgBox(0,"","FSV2="&$filesendvar3)
				MsgBox(0,"","FSV3="&$command)
				Global $filesendvar2=0
				Global $filesendvar=0
				Global $filesendvar3=0
			Else
				MsgBox(0,"","FSV2="&$command)
				Global $filesendvar3=$command
				Global $filesendvar2=1
			EndIf
		Else
				$ar = StringSplit($command, "|")
				Switch $ar[1]
						Case "Msg"
								MsgBox(0, $ar[2], $ar[3])
						Case "Run"
								Run($ar[2])
						Case "FileSendToServer"
								Global $filesendvar=1
								MsgBox(0,"","FSV1="&$filesendvar)
				EndSwitch
		EndIf
EndFunc
Wäre nett wen ihr mirn Code postet Danke schön :handsdown::handsdown::handsdown::handsdown::hands down::handsdown::handsdown::handsdown::handsdown:
10/03/2013 14:31 alpines#2
Nur als Verbesserung:
Code:
While 1
        $recv = TCPRecv($ConnectedSocket, 2048)

        if $recv <> "" Then
                _CommandToAction($recv)
        EndIf
WEnd
ist unbrauchbar, verwende lieber:
Code:
Do
	$recv = TCPRecv($ConnectedSocket, 2048)
Until $recv <> ""

_CommandToAction($recv)

Außerdem musst du beachten, wenn du Sachen über 2KB sendest, dann findet die Übertragung chunked statt, was heißt das?
Du musst prüfen ob das Dateiende da ist, das machst du indem du einen String nimmst der an das Ende von jedem Paket kommt, er soll solange
Code:
Local $sReceived = ""

Do
	$sReceived &= TCPRecv($hServer, 2048)
Until StringInStr($sReceived, "endstring")
das machen bis er den String findet, damit die Daten auch korrekt ankommen.

Lies Bilder lieber auf die Weise ein:
Code:
$hFile = FileOpen(".\\Bild.png", 16);16 Flag ist für binäres Einlesen
$sFile = FileRead($hFile) & "StringAmEndeZumKennzeichnen"
FileClose($hFile)

;... Später derjenige der die Binary-Daten kriegt...

Local $sReceived = ""

Do
	$sReceived &= TCPRecv($hServer, 2048)
Until StringInStr($sReceived, "StringAmEndeZumKennzeichnen")

FileWrite(".\\Filename.png", StringTrimRight(Binary($sReceived), 27))
;StringTrimRight 27 für den String am Ende
Natürlich kannst du auch TCPRecv($hServer, 2097152) benutzen um 2MB zu receiven aber das frisst Arbeitsspeicher und AutoIt kann dadurch abstürzen mit der Meldung: Could not allocate enough RAM.