sss
Продвинутый
- Сообщения
- 332
- Репутация
- 96
Всем доброго времени суток! Мне бы хотелось написать свой файловый сервер (причины: часто гоняю файлы по сети, инет не безлимит, DC++ постоянно глючит, каждый раз поднимать и настраивать FTP - морока, а потом еще и скачать AutoIt'ом...). В TCP... фукциях разбираюсь на уровне "чайник" (читающий со словарем ). Я думаю, алгоритм примерно такой:
1) запуск сервера
2) конектимся клиентом
3) "приветственные" сообщения (проверка связи и т.п.)
4) посылка серверу сообщения вида "хочу_скачать--имя файла"
5) сервер обрабатывает, говорит клиенту "согласен"
6) сервер читает выбранный файл в бинарном режиме и посылает пучками по n символов клиенту, дожидаясь от того подтверждения приема пучка
7) файл скачан, проверяем md5(не обязательно), клиент отключается
8. сервер ждет нового подключения.
В принципе, я реализовал такой алгоритм(будет ниже). Пучки были по 1000 (999) символов. Пытался скачать файл test.mp3 и для отладки в нек. местах будет непонятный код, ну это ладно . У меня почему застревает процесс передачи где-то на 20-30 Кб. Дальше ощущение что AutoIt "висит" или код неверен. Помогите решить проблему! Заранее спасибо!
Коды:
Если что, не пинайте, искал здесь и на оф. форуме по запросам "передать файл, сервер, закачать файл" и другие (на оф. форуме, ясно, было по англ.)
1) запуск сервера
2) конектимся клиентом
3) "приветственные" сообщения (проверка связи и т.п.)
4) посылка серверу сообщения вида "хочу_скачать--имя файла"
5) сервер обрабатывает, говорит клиенту "согласен"
6) сервер читает выбранный файл в бинарном режиме и посылает пучками по n символов клиенту, дожидаясь от того подтверждения приема пучка
7) файл скачан, проверяем md5(не обязательно), клиент отключается
8. сервер ждет нового подключения.
В принципе, я реализовал такой алгоритм(будет ниже). Пучки были по 1000 (999) символов. Пытался скачать файл test.mp3 и для отладки в нек. местах будет непонятный код, ну это ладно . У меня почему застревает процесс передачи где-то на 20-30 Кб. Дальше ощущение что AutoIt "висит" или код неверен. Помогите решить проблему! Заранее спасибо!
Коды:
Код:
TCPStartup()
; открываем сокет на прослушку
;==============================================
$ip='192.168.0.2' ; это ип сервера, т.е. компа на котором запустили
$port='3333'
$MainSocket = TCPListen($ip, $port)
; если ошибка
If $MainSocket = -1 Then
MsgBox(16,@error,'Ошибка открытия сокета!')
Exit
EndIf
$ConnectedSocket = -1
Do
$ConnectedSocket = TCPAccept($MainSocket)
Until $ConnectedSocket <> -1
;~ MsgBox(0,'','')
while 1
if $ConnectedSocket=-1 Then
_wait_Connection()
Else
$recv = TCPRecv($ConnectedSocket, 50)
If @error Then $ConnectedSocket=-1
If $recv = '~~begin' and $ConnectedSocket<> -1 then
TCPSend($ConnectedSocket,'~~confirming')
ExitLoop
EndIf
EndIf
WEnd
While 1
if $ConnectedSocket=-1 Then
_wait_Connection()
Else
$recv = TCPRecv($ConnectedSocket, 50)
If @error Then $ConnectedSocket=-1
If StringInStr($recv,'~~download¬')>0 and $ConnectedSocket<> -1 then
$split=StringSplit($recv,'¬')
$filename='test.mp3'
$fileopen=FileOpen ( @ScriptDir & '\' & $filename, 16 )
$fileread=FileRead($fileopen)
TCPSend($ConnectedSocket,'~~ready')
ExitLoop
EndIf
EndIf
WEnd
While 1
if $ConnectedSocket=-1 Then
_wait_Connection()
Else
$to_send=StringLeft($fileread,999)
$fileread=StringTrimLeft($fileread,999)
TCPSend($ConnectedSocket,$to_send)
While 1
$recv = TCPRecv($ConnectedSocket, 50)
if $recv='~~ok' then
ExitLoop
EndIf
if $ConnectedSocket=-1 Then Exit
WEnd
If @error Then $ConnectedSocket=-1
if StringLen($fileread)<999 Then
TCPSend($ConnectedSocket,'~~end')
Exit
EndIf
EndIf
WEnd
TCPShutdown()
func _wait_Connection()
Do
$ConnectedSocket = TCPAccept($MainSocket)
Sleep(1000)
Until $ConnectedSocket <> -1
EndFunc
Код:
TCPStartup()
; Для отслеживания коннекта
;==============================================
$ConnectedSocket = -1
$file_to_write=@ScriptDir & '\test2.mp3'
;Коннект
;=======================================================
$server_ip='192.168.0.2' ; ип сервера
$server_port='3333'
$ConnectedSocket = TCPConnect($server_ip, $server_port)
If @error Then
MsgBox(4112, "Ошибка", "Сервер не найден! Код ошибки: " & @error)
Exit
endif
$ret = TCPSend($ConnectedSocket, '~~begin')
If @ERROR then Exit
While 1
if $ConnectedSocket=-1 then
Exit
Else
$recv = TCPRecv($ConnectedSocket, 50)
If @error Then $ConnectedSocket=-1
If $recv = '~~confirming' and $ConnectedSocket<> -1 then
ExitLoop
EndIf
EndIf
WEnd
$ret = TCPSend($ConnectedSocket, '~~download¬test.mp3')
If @ERROR then Exit
While 1
if $ConnectedSocket=-1 then
Exit
Else
$recv = TCPRecv($ConnectedSocket, 50)
If @error Then $ConnectedSocket=-1
If $recv = '~~ready' and $ConnectedSocket<> -1 then
ExitLoop
EndIf
EndIf
WEnd
$fileopen=FileOpen ( $file_to_write, 2+16 )
$recv=''
while 1
$old_recv=$recv
$recv = TCPRecv($ConnectedSocket, 1000)
If @error Then $ConnectedSocket=-1
if $recv='~~end' Then
Exit
Else
if not $recv=$old_recv Then
FileWrite($fileopen,$recv)
TCPSend($ConnectedSocket, '~~ok')
EndIf
EndIf
WEnd