Цитата 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