Что нового

Как отправлять файлы по TCP?

djasup

Новичок
Сообщения
64
Репутация
1
Пользовался поиском, смог отправлять строки, но теперь вопрос как можно отправлять файл например txt?
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
На офф. сайте нашел.

Получение файла:
Код:
Func _FileRecieve($sFileName, $iAccSocket)
    Local $sBuff, $sRecv = "", $i = 0, $iFirstWhile = True

    If @error Then Return 0

    $sBuff = Binary ($sBuff)

    While $sRecv = ""
        $sRecv = TCPRecv($iAccSocket, 2048, 1)
        $sRecv = BinaryToString ($sRecv)
    WEnd

    While $sRecv <> ""
        If StringInStr($sRecv, ',') And $iFirstWhile Then
            $sTmp = StringLeft($sRecv, StringInStr($sRecv, ",") - 1)
            $sRecv = StringTrimLeft($sRecv, StringLen($sTmp) + 1)
            If StringLen($sFileName) < 1 Then $sFileName = $sTmp
            $iFirstWhile = False
        EndIf
        $sBuff &= $sRecv
        $sRecv = BinaryToString (TCPRecv($iAccSocket, 2048, 1))
        If @error Then ExitLoop
    WEnd

    $iFileOp = FileOpen($sFileName, 16 + 2)
    If @error Then Return 0
    FileWrite($iFileOp, $sBuff)
    If @error Then Return 0
    FileClose($iFileOp)

    Return 1
EndFunc  ;==>_FileReceive


Отправка файла:
Код:
Func _FileSend($sFile, $iMainSocket)
    Local $sBuff, $iFileOp,$sRecv

    $iFileOp = FileOpen($sFile, 16)
    If @error Then Return 0
    $sBuff = Binary(StringTrimLeft($sFile,StringInStr($sFile,"\",-1,-1))&",")&FileRead($iFileOp)
    FileClose($iFileOp)

    While BinaryLen($sBuff)
        $iSendReturn = TCPSend($iMainSocket, $sBuff)
        If @error Then Return 0

        $sBuff = BinaryMid ($sBuff, $iSendReturn + 1, BinaryLen ($sBuff) - $iSendReturn)
    WEnd

    Return 1
EndFunc
 
Автор
D

djasup

Новичок
Сообщения
64
Репутация
1
Нашел примеры , делаю по другому
Сервер
Код:
Global $iSocket = 33880
Global $hSocket = -1


TCPStartup()
$MainSocket = TCPListen("127.0.0.1", $iSocket, 1)
If $MainSocket<0 Then Exit MsgBox(16, "TCP Error", "Unable to intialize socket.")

$tsCTR = DllStructCreate("char Path[256];uint64 Size") ; управляющая структура копирования файла
$izCTR = DllStructGetSize($tsCTR)                      ; размер структуры
$ipCTR = DllStructGetPtr ($tsCTR)                      ; указатель
$tbCTR = DllStructCreate("byte["& $izCTR &"]", $ipCTR) ; сериализованная структура (в бинарном виде)

While 1

    If $hSocket<0 Then
        $hSocket = TCPAccept($MainSocket)
        If $hSocket<0 Then ContinueLoop
        ; Получаем инфу о файле - назначение и размер
        $bData = Binary("")
        Do
            $bData &= TCPRecv($hSocket, 1, 1)
            If @error Then
                TCPCloseSocket($hSocket)
                $hSocket=-1
                ConsoleWrite("Ошибка получения параметров файла! Операция отменена." &@CRLF)
                ContinueLoop 2
            EndIf
        Until BinaryLen($bData)=$izCTR
        ; Считываем параметры
        DllStructSetData($tbCTR, 1, $bData)
        $sFile = DllStructGetData($tsCTR, "Path")
        $iFile = DllStructGetData($tsCTR, "Size")
        ; Создание файла
        $hFile = FileOpen($sFile, 2+16)
        If $hFile<0 Then
            TCPCloseSocket($hSocket)
            $hSocket=-1
            ConsoleWrite("Ошибка создания файла! Операция отменена." &@CRLF)
            ContinueLoop
        EndIf
        ; Процесс копирования данных
        $bData = Binary("")
        $zData = 0
        While $zData<$iFile
            $bData = TCPRecv($hSocket, 65536, 1)
            If @error Then
                TCPCloseSocket($hSocket)
                FileClose($hFile)
                ConsoleWrite("Соединение прервано! Операция отменена." &@CRLF)
                ContinueLoop 2
            EndIf
            $zData += BinaryLen($bData)
            If FileWrite($hFile, $bData)=0 Or $zData>$iFile Then
                TCPCloseSocket($hSocket)
                FileClose($hFile)
                ConsoleWrite("Неустранимая ошибка при копировании! Операция отменена." &@CRLF)
                ContinueLoop 2
            EndIf
        WEnd

        FileClose($hFile)
        ConsoleWrite("Файл успешно скопирован! ("& $sFile &")" &@CRLF)
	 EndIf

WEnd


Клиент
Код:
Func _TCP_FileSend($server, $port, $FileFrom, $FileTo)
    Local $hSocket = TCPConnect($server, $port)
    If $hSocket = -1 Then Return 

    Local $hFile = FileOpen($FileFrom, 16)
    Local $zFile = FileGetSize($FileFrom), $bData, $zData
    If $hFile<0 Then Return 

    Local $tsCTR = DllStructCreate("char Path[256];uint64 Size")
    Local $izCTR = DllStructGetSize($tsCTR)
    Local $ipCTR = DllStructGetPtr ($tsCTR)
    Local $tbCTR = DllStructCreate("byte["& $izCTR &"]", $ipCTR)

    DllStructSetData($tsCTR, "Path", $sFileTo)
    DllStructSetData($tsCTR, "Size", $zFile)

    TCPSend($hSocket, DllStructGetData($tbCTR, 1))
    If @error Then Return 
    While 1
        $bData = FileRead($hFile, 65536)
        If @error<0 Then ExitLoop
        If @error>0 Then Return 

        $zData += BinaryLen($bData)
        TCPSend($hSocket, $bData)
        If @error Then Return 
    WEnd

    FileClose($hFile)
    TCPCloseSocket($hSocket)
    Return True
EndFunc


Если отправляю один файл то все ок, но я отправляю так
Код:
For $z = 1 To $FileList[0]
	 	TCPStartup()
			$zStroka = StringRegExpReplace($FileList[$z], '^.*\\', '')
			$sFileTo = $sFileTP&$zStroka
			_TCP_FileSend($g_IP, $k_Port,$FileList[$z],$sFileTo )
			TCPShutdown () 
	  Next

Т.е. по циклу , несколько файлов и ничего не приходит :(
Вопрос : Почему так происходит и что исправить?
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
djasup
На мой взгляд проблема тут
Код:
$sFileTo = $sFileTP&$zStroka

т.к. нигде не вижу переменную $sFileTP
 
Автор
D

djasup

Новичок
Сообщения
64
Репутация
1
DarWiM
Код:
Global $sFileTP   = "C:\Users\Андрей\Desktop\dataRecevied\"



Добавлено:
Сообщение автоматически объединено:

а в
Код:
$zStroka
имя и расширение файла
 
Верх