Что нового

[Сеть, интернет] Непонятная ошибка в получении/передачи пакетов (TCP)

svigelf

Знающий
Сообщения
61
Репутация
17
Отпишите пожалуйста, если будет работать или не работать :IL_AutoIt_1:
будем продолжать додумывать код :smile:
 

svigelf

Знающий
Сообщения
61
Репутация
17
А вот и для Файлов! :IL_AutoIt_1:

отправляет на сервер пакетами по 100 кб... надо будет, переделаете)
Код:
;(Клиент)

$g_IP = "127.0.0.1"

$sSelectedFile = FileOpenDialog("Please select file...", @ScriptDir, "All (*.*)",1); отображаем диалог выбора файла
$sSelectedFileName = StringMid($sSelectedFile, StringInStr($sSelectedFile, "\", 0, -1) + 1) ; отделяем имя файла

; Start The TCP Services
;==============================================
TCPStartUp()

; Connect to a Listening "SOCKET"
;==============================================
$socket = TCPConnect( $g_IP, 80 )
If $socket = -1 Then Exit

TCPSend ($socket, $sSelectedFileName)
Sleep (1000)
$hSelectedFile = FileOpen ($sSelectedFile, 16) ; сначала открываем файл для чтения в бинарном режиме
While 1
   $Data = FileRead($hSelectedFile, 100*1024); read 100 kb of data
   If @error = -1 Then ExitLoop
   TCPSend ($socket, $Data)
WEnd
FileClose ($hSelectedFile);закрываем



;(Сервер)

$g_IP = "127.0.0.1"

; Start The TCP Services
;==============================================
TCPStartUp()

; Create a Listening "SOCKET"
;==============================================
$MainSocket = TCPListen($g_IP, 80,  2)
If $MainSocket = -1 Then Exit

While 1
$ConnectedSocket = TCPAccept( $MainSocket)
If $ConnectedSocket >= 0 Then
	While 1
	$sSelectedFileName = TCPRecv($ConnectedSocket, 2048)
	If @error Then ExitLoop
	If $sSelectedFileName <> "" Then
	$hWrite = FileOpen(@ScriptDir & "\" & $sSelectedFileName, 16+2); Create file to write binary data
	While 1
		$xData = TCPRecv($ConnectedSocket, 100*1024, 1); Read 100 kb of data
		If @error Then ExitLoop
		If $xData <> "" Then
		FileWrite($hWrite, $xData)
		EndIf
	WEnd
	FileClose ($hWrite);закрываем
              ExitLoop
	EndIf
	WEnd
EndIf
Wend
 
Автор
D

Dream-52

...
Сообщения
82
Репутация
1
спасибо !!!!! буду пробывать :laugh: :laugh: :laugh: :laugh:
:beer:
 
Автор
D

Dream-52

...
Сообщения
82
Репутация
1
Никак чтото не могу додуматся как сделать прогресс..... :whistle:

Код:
Func SendFile()
	$ip__ = '192.168.0.6'
	$port__ = 59882
	$sSelectedFile = FileOpenDialog("Please select file...", @ScriptDir, "All (*.*)", 1); отображаем диалог выбора файла

	$socket = TCPConnect($ip__, $port__)
	If $socket = -1 Then Exit

	TCPSend($socket, 'file')
	Sleep(1000)
	$hSelectedFile = FileOpen($sSelectedFile, 16) ; сначала открываем файл для чтения в бинарном режиме
	$fileget = FileGetSize($sSelectedFile)
	$filegeta = 0

	ProgressOn("Progress Meter", "Increments every second", "0 percent")

	For $i = $fileget / 100 To $fileget Step $fileget / 100

			$Data = FileRead($hSelectedFile, 100 * 1024)

			If $Data = -1 Then ExitLoop
			TCPSend($socket, $Data)
			ProgressSet($i, $i & " percent")

			Sleep(500)


	Next

	ProgressOff()

	FileClose($hSelectedFile);закрываем
	TCPCloseSocket($socket)
EndFunc   ;==>SendFile
 

svigelf

Знающий
Сообщения
61
Репутация
17
он и не будет работать... :
Замечания

Переменная-счетчик $Variable автоматически создается в области видимости LOCAL даже в том случае, если опция MustDeclareVars установлена.

Выражения For...Next могут быть вложены друг в друга. Цикл For завершается, когла значение variable превышает пороговое значение stop. Если stepVal или stop являются переменными, то это значения фиксируется после первого вычисления в начале выполнения цикла.

Цикл For не выполняется, если:
start > stop и step > 0 или
start < stop и step < 0

считай проценты по другому, например так:

(размер файла/1024)/100 = кол-во секций в файле по 100 кб (100%)
1% = кол-во секций по 100кб/100
 
Автор
D

Dream-52

...
Сообщения
82
Репутация
1
а как же сделать так чтоб работало??? :whistle:
 

svigelf

Знающий
Сообщения
61
Репутация
17
(сервер так оставляем, какой я раньше давал)

клиент:

Код:
$g_IP = "127.0.0.1"

$sSelectedFile = FileOpenDialog("Please select file...", @ScriptDir, "All (*.*)",1); отображаем диалог выбора файла
$sSelectedFileName = StringMid($sSelectedFile, StringInStr($sSelectedFile, "\", 0, -1) + 1) ; отделяем имя файла

; Start The TCP Services
;==============================================
TCPStartUp()

; Connect to a Listening "SOCKET"
;==============================================
$socket = TCPConnect( $g_IP, 80 )
If $socket = -1 Then Exit

TCPSend ($socket, $sSelectedFileName)
Sleep (1000)
$hSelectedFile = FileOpen ($sSelectedFile, 16) ; сначала открываем файл для чтения в бинарном режиме

$fileget = FileGetSize($sSelectedFile)

$Sec = $fileget/102400
$precent = $Sec/100

ProgressOn("Progress Meter", "Increments every second", "0 percent")

$i = 0

While 1
   $Data = FileRead($hSelectedFile, 100*1024); read 100 kb of data
   If @error = -1 Then ExitLoop
   TCPSend ($socket, $Data)
   $i = $i + 1

   ProgressSet( Int($i/$precent), Int($i/$precent) & " percent")

WEnd
FileClose ($hSelectedFile);закрываем
ProgressSet( 100, 100 & " percent")

ProgressOff()

:D у меня работает, правда изза того,что передает с диска ц в диск д ,, сразу 100 % пишет)
(Немного переделал)
 
Автор
D

Dream-52

...
Сообщения
82
Репутация
1
ладно,это уже мелочи..просто немного не компактно,но буду думать,и...спасибо тебе большое за помощь)


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

ура :IL_AutoIt_1:
 

svigelf

Знающий
Сообщения
61
Репутация
17
:ok: незачто

tcp_peredaca.jpg
 

svigelf

Знающий
Сообщения
61
Репутация
17
:smile: я там немного переделал код)

теперь не показывает эти огроменные числа в процентах, теперь челое число
Код:
Int($i/$precent)


есть только одна проблемка систему грузит очень сильно...но если по интернету передавать, там, где скорость не очень большая думаю так тормозить не будет :smile:
 
Автор
D

Dream-52

...
Сообщения
82
Репутация
1
Через сеть работает непонятно вообще как..))) :whistle:
 

svigelf

Знающий
Сообщения
61
Репутация
17
:smile: "готовый" вариант с отображением прогресса передачи файла

Сервер
Код:
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
$g_IP = "127.0.0.1"
TCPStartUp()
$MainSocket = TCPListen($g_IP, 80,  2)
If $MainSocket = -1 Then Exit
While 1
$ConnectedSocket = TCPAccept( $MainSocket)
If $ConnectedSocket >= 0 Then
    While 1
    $sSelectedFileName = TCPRecv($ConnectedSocket, 2048)
    If @error Then ExitLoop
    If $sSelectedFileName <> "" Then
    $senddata = StringSplit ($sSelectedFileName, ":")
    GUICreate("Прием файлов", 500, 135)
	GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUICtrlCreateLabel ("Принимаем файл :" & @CR & @CR & @ScriptDir & "\" & $senddata[2],  10, 10, 480, 50)
    $progressbar = GUICtrlCreateProgress (10,70,480,20)
	$progress = GUICtrlCreateLabel ("Принято 0 процентов", 10, 100, 200, 30)
    GUICtrlSetColor( -1, 0xFF0000)
    GUISetState ()
    $hWrite = FileOpen(@ScriptDir & "\" & $senddata[2], 16+2); Create file to write binary data
    $i = 0
    AdlibRegister ("progres", 1000)
    func progres()
	GUICtrlSetData ($progressbar,Int($i/$senddata[1]))
	If Int($i/$senddata[1]) = 100 Then
		GUICtrlSetData ($progress,"Принято 100 процентов")
		GUICtrlSetColor( -1, 0x00FF00)
	EndIf
    GUICtrlSetData ($progress,"Принято " & Int($i/$senddata[1]) & " процентов")
    EndFunc
    While 1
        $xData = TCPRecv($ConnectedSocket, 100*1024, 1); Read 100 kb of data
        If @error Then
            FileClose ($hWrite)
            FileDelete (@ScriptDir & "\" & $senddata[2])
            MsgBox(16, "Передачи файлов", "Ошибка приема", 10)
            Exit
		EndIf
        If $xData <> "" Then
        FileWrite($hWrite, $xData)
        $i = $i + Number(BinaryLen($xData)/102400)
		EndIf
    WEnd
    EndIf
    WEnd
EndIf
Wend
Func _Exit()
If Int($i/$senddata[1]) < 100 Then
	FileClose ($hWrite)
	FileDelete (@ScriptDir & "\" & $senddata[2])
	MsgBox(64, "Прием файлов", "Прием отменен", 10)
	Exit
Else
	AdlibUnRegister ("progres")
	FileClose ($hWrite);закрываем
	Exit
EndIf
EndFunc
Клиент
Код:
#include <GUIConstants.au3>
$g_IP = "127.0.0.1"
$sSelectedFile = FileOpenDialog("Please select file...", @ScriptDir, "All (*.*)",1); отображаем диалог выбора файла
If @error Then Exit
$sSelectedFileName = StringMid($sSelectedFile, StringInStr($sSelectedFile, "\", 0, -1) + 1) ; отделяем имя файла
TCPStartUp()
$socket = TCPConnect( $g_IP, 80 )
If $socket = -1 Then Exit
$hSelectedFile = FileOpen ($sSelectedFile, 16) ; сначала открываем файл для чтения в бинарном режиме
$fileget = FileGetSize($sSelectedFile)
$Sec = $fileget/102400
$precent = $Sec/100
TCPSend ($socket, $precent & ":" & $sSelectedFileName)
Sleep (500)
GUICreate("Передача файлов", 500, 135)
GUICtrlCreateLabel ("Передаем файл :" & @CR & @CR & $sSelectedFile,  10, 10, 480, 50)
$progressbar = GUICtrlCreateProgress (10,70,480,20)
$progress = GUICtrlCreateLabel ("Передано 0 процентов",  10, 100, 200, 30)
GUICtrlSetColor( -1, 0xFF0000)
GUISetState ()
$i = 0
AdlibRegister ("progres", 1000)
func progres()
GUICtrlSetData ($progressbar,Int($i/$precent))
GUICtrlSetData ($progress,"Принято " & Int($i/$precent) & " процентов")
EndFunc
While 1
    $Data = FileRead($hSelectedFile, 100*1024); read 100 kb of data
    If @error = -1 Then ExitLoop
    TCPSend ($socket, $Data)
    If @ERROR Then
        MsgBox(16, "Передача файлов", "Ошибка передачи", 10)
        Exit
    EndIf
    $i = $i + 1
    If GUIGetMsg() = $GUI_EVENT_CLOSE Then
        MsgBox(64, "Передача файлов", "Передача отменена", 10)
        Exit
    EndIf
WEnd
AdlibUnRegister ("progres")
FileClose ($hSelectedFile);закрываем
GUICtrlSetData ($progressbar,100)
GUICtrlSetData ($progress,"Передано 100 процентов")
GUICtrlSetColor( -1, 0x00FF00)
While 1
    If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Dream-52
Мне кажется тема более чем исчерпана, по другим вопросам в новую тему.

Решено?
 
Автор
D

Dream-52

...
Сообщения
82
Репутация
1
CreatoR сказал(а):
Dream-52
Мне кажется тема более чем исчерпана, по другим вопросам в новую тему.

Решено?

К сожалению нет...может ты подскажешь? нужно просто коректный метод отображение прогресса . В приведенных примерах ..не совсем то что нужно - думаю ты сомной тут согласишся...доброе утро тебе :laugh: КРЕАТОР!
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Dream-52 [?]
К сожалению нет...может ты подскажешь? нужно просто коректный метод отображение прогресса
В названий темы, и в теле первого сообщения это не указано, т.ч тема решена.

В приведенных примерах ..не совсем то что нужно - думаю ты сомной тут согласишся
Увы, но не могу, я вижу в примерах то что ты просил, а “не совсем то что нужно” ничего не объясняет, помоему тебе дали придостаточно информаций для решения твоих вопросов, так же не забывай о справке, где есть примеры построения прогресса.
 
Автор
D

Dream-52

...
Сообщения
82
Репутация
1
CreatoR сказал(а):
Dream-52 [?]
К сожалению нет...может ты подскажешь? нужно просто коректный метод отображение прогресса
В названий темы, и в теле первого сообщения это не указано, т.ч тема решена.

В приведенных примерах ..не совсем то что нужно - думаю ты сомной тут согласишся
Увы, но не могу, я вижу в примерах то что ты просил, а “не совсем то что нужно” ничего не объясняет, помоему тебе дали придостаточно информаций для решения твоих вопросов, так же не забывай о справке, где есть примеры построения прогресса.


ты действительно думаешь что я забыл о ней ? :whistle:


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

Кретор злой ! Никогда бы не подумал что такой милый парень может быть злым :blink: Автоит в шоке :wacko:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
OffTopic:
Dream-52 [?]
Не знаю кто такой “Кретор”, но если речь обо мне, то в офлайн я могу быть ещё злее ;). Всё зависит от людей вокруг, хотя у меня обычно с людьми отношения очень хорошие, я почти ни с кем не ссорюсь.

P.S
На этом заканчиваем оффтоп.
 
Верх