Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: [решено] Коннект
Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата morgan1991:
каким образом всётаки можно передать файл от клиента к серверу? »
Не так все просто - тут нужно подобрать оптимальный для себя протокол обмена - команды, данные, подтверждения и т.д. Вариантов куча - все зависит от задачи. Вот пример односторонней передачи данных (без подтверждения) - сначала имя файла, размер, потом данные, при ошибке сессия сбрасывается.

сервер:
Код: Выделить весь код
Global $iSocket = 33890
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
клиент:
Код: Выделить весь код
Global $hSocket = -1
Global $sServer = "127.0.0.1"
Global $iServer = 33890

Global $sFileFrom = "d:\MyGame.ISO"          ; файл-источник на клиенте (ЧТО)
Global $sFileTo   = "c:\InBox\YourGame.ISO"  ; файл-приемник на сервере (КУДА)

TCPStartup()
_TCP_FileSend($sServer, $iServer, $sFileFrom, $sFileTo)
TCPShutdown()

Func _TCP_FileSend($server, $port, $FileFrom, $FileTo)
    Local $hSocket = TCPConnect($server, $port)
    If $hSocket = -1 Then Return SetError(1, 0, False)

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

    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 SetError(2, 1, False)

    Local $iProgress = 0
    ProgressOn("Copy Progress", "Increments every 65536 bytes", "0 percent")

    While 1
        $bData = FileRead($hFile, 65536)
        If @error<0 Then ExitLoop
        If @error>0 Then Return SetError(3, 2, False)

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

        $iProgress = $zData/$zFile*100
        ProgressSet($iProgress, StringFormat("Copied %-2i\% percent...", $iProgress))
    WEnd

    ProgressOff()
    FileClose($hFile)
    TCPCloseSocket($hSocket)
    Return True
EndFunc
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:42, 10-04-2009 | #26

Название темы: [решено] Коннект