PDF Dokumete per Netzwerk Senden

  • Hallo Leute

    ich versuche seid Tagen ein PDF Dokument per TCP zu versenden ohne Erfolg könnte mir jemand helfen.
    Anbei findet Ihr den Client und den Server.

    [autoit]


    #include <array.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #include <ComboConstants.au3>

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

    local $sReadData
    TCPStartup() ; TCP wird initialisiert

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

    $name = TCPNameToIP ("127.0.0.1")
    $Connection = TCPConnect($name, 4321)

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

    If $Connection = -1 Then ; Wenn $socket = -1 ist, Fehlermeldung ausgeben
    MsgBox(16, "Error", "Die Verbindung zum Server konnte nicht hergestellt werden!")
    EndIf

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

    $FileName = "Lipo.pdf"
    $SourceFile = FileOpen("D:\TestServerClient\Lipo.pdf",16)
    $FileData = FileRead($SourceFile)
    $pdfsendedaten = StringToBinary($FileData)
    $sReadData = $FileName & "|" & $pdfsendedaten

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

    While 1
    $r = StringLeft($sReadData, 1048576)
    ;MsgBox(0,"", $r)
    $sReadData = StringTrimLeft($sReadData, 11048576)
    TCPSend($Connection, $r)
    sleep(40)
    if $sReadData = "" then exitloop
    WEnd

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

    If $sReadData = 0 Then
    MsgBox(16, @error, "Das Paket konnte nicht gesendet werden.")
    EndIf
    FileClose($SourceFile)

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

    TCPCloseSocket($Connection)
    TCPShutdown()
    Exit

    [/autoit]

    Server

    [autoit]


    #include <array.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #include <ComboConstants.au3>

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

    TCPStartup() ; TCP wird initialisiert

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

    Dim $receivedArray[2]
    Local $sRecvMsg, $sRecvMsgPart

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

    Local $MainSocket = TCPListen(@IPAddress1, 4321, 100)
    If $MainSocket = -1 Then MsgBox(0, "", "Socket konnet nicht aufgebaut werden")

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

    While 1 ; Endlosschleife
    Local $ConnectedSocket = TCPAccept($MainSocket)
    If $ConnectedSocket >= 0 Then
    While Sleep(40)
    $sRecvMsg = TCPRecv($ConnectedSocket,1048576 ,1)
    If $sRecvMsg <> "" Then
    Do
    $sRecvMsgPart = TCPRecv($ConnectedSocket ,1048576 ,1)
    If @error Then FileWriteLine(@ScriptDir & "\Server.log", @error & @CRLF)
    $sRecvMsg &= $sRecvMsgPart
    Until $sRecvMsgPart <> ""
    ; verarbeitung der Daten in $sRecvMsg
    EndIf
    WEnd
    _Filewrite()
    EndIf
    WEnd

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

    Func _Filewrite()
    ConsoleWrite(BinaryToString($sRecvMsg) & @LF)
    $senddata = BinaryToString($sRecvMsg)
    MsgBox(0,"", BinaryToString($sRecvMsg))
    $sRecvMsgSplit = StringSplit($senddata, "|")
    FileOpen("D:\TestServerClient\PDFTransfer" &"\" & $sRecvMsgSplit[1] ,16)
    FileWrite("D:\TestServerClient\PDFTransfer" &"\" & $sRecvMsgSplit[1] , $sRecvMsgSplit[2])
    FileClose($senddata)
    TCPCloseSocket($ConnectedSocket)
    EndFunc

    [/autoit]

    Wo liegt der Fehler???
    Bin ich total auf dem Holzweg ??

    gruss

    McBaldrian

    Solange
    du den anderen sein Anderssein nicht verzeihen kannst, bist du noch weit ab vom
    Wege der Weisheit.

  • [autoit]

    While Sleep(40);while ist hier richtig. mit sleep und allem
    $sRecvMsg = TCPRecv($ConnectedSocket,1048576 ,1);auch gut
    If $sRecvMsg <> "" Then;es wird abgefragt, ob eine message angekommen ist
    Do
    $sRecvMsgPart = TCPRecv($ConnectedSocket ,1048576 ,1);was soll hier denn hin??? Du hast deine Message doch in $sRecvMsg gespeichert.
    If @error Then FileWriteLine(@ScriptDir & "\Server.log", @error & @CRLF)
    $sRecvMsg &= $sRecvMsgPart
    Until $sRecvMsgPart <> ""
    ; verarbeitung der Daten in $sRecvMsg
    EndIf
    WEnd

    [/autoit]


    Ich denke das Problem liegt im Verständnis von TCPRecv.
    Stell es dir wie eine Schachtel vor. Alles was dein Client sendet wird beim Server in die Schachtel gepackt. Wenn du TCPRecv aufufst wird die Schachtel geleert und alles in die Variable kopiert.
    Dadurch kann es sein, dass TCPRecv ein leeres Ergebnis zurückgibt in deiner DO Schleife. Dadurch gehst du sofort wieder aus der Schleife heraus.
    Das TCPRecv wartet nicht darauf, dass eine Message ankommt.
    Es kann auch passieren, dass mehrere Pakete, die du von deinem Clienten abschickst auf einmal ankommen.
    Client sendet "ab" und "r" und "c"
    Server TcpRecv liefert: "" und "" und "" und "ab" und "" und "rc"