sforce5
Олл фо ЛулзЪ
- Сообщения
- 160
- Репутация
- 41
А если проверять «@error <> 0»?Всё равно не выходит из цикла
CreatoR сказал(а):А если проверять «@error <> 0»?
и как определяется что функция больше не возвращает данные?
TCPStartup()
While 1
$nMsg = GUIGetMsg()
Select
Case $nMsg = $GUI_EVENT_CLOSE or $nMsg = $close_btn
TCPShutdown()
Exit
Case $nMsg = $connect_btn
$connect = TCPConnect($server_ip, $tcp_port)
Case $nMsg = $go_btn
TCPSend($connect, "start")
While 1
$recv = TCPRecv($connect, 2048, 1)
If @error Then ExitLoop
If $recv <> "" Then FileWrite(@ScriptDir &"\tcp_data.bin", $recv)
WEnd
EndSelect
WEnd
sforce5 сказал(а):Как можно сделать чтоб по окончанию принятия данных цикл завершался?
Значит видимо сервер продолжает посылать данные клиенту.С сервером проблем нет, а у клиента ошибку эту не могу исправить
CreatoR сказал(а):Значит видимо сервер продолжает посылать данные клиенту.
While 1
Do
$connect = TCPAccept($socket)
Until $connect <> -1
While 1
$command = TCPRecv($connect, 4, 1)
If @error Then ExitLoop
Switch $command
Case "start"
$size = FileGetSize(@ScriptFullPath)
$hFile = FileOpen(@ScriptFullPath, 16)
While $bytesent < $size
$buff = FileRead($hFile, 2048)
TCPSend($connect, $buff)
If @error Then ExitLoop
$bytesent += 2048
WEnd
Global $bytesent = 0
ExitLoop
EndSwitch
WEnd
WEnd
CreatoR сказал(а):и как определяется что функция больше не возвращает данные?
CreatoR сказал(а):А сокет вроде нужно закрывать после чтения...
CreatoR сказал(а):
Т.е. флаг @error принимает значение -1 только при ошибке сокета, а не при прекращении передачи данных от сервера. Т.е. при нормальном рабочем соединении @error никогда не станет -1 и цикл превращается в бесконечный. Т.е. делать нужно примерно так:Return ValueSuccess: Returns binary/string sent by the connected socket.
Failure: Returns "" and set @error
@error: -1 Socket error
windows API WSAGetError return value (see MSDN).
$ret = _WaitTcpResponse()
While Not ;[проверяем, что cодержимое переменной $ret не содержит признаков конца передачи]
$ret &= _WaitTcpResponse()
If @error Then ExitLoop
WEnd
ConsoleWrite ($ret & @CRLF)
Func _WaitTcpResponse($timeout = 30000)
Local $ret
Local $T = TimerInit()
While 1
If TimerDiff($T) > $timeout Then
Return -1
EndIf
$ret = TCPRecv ($connect, 2048)
If $ret <> "" Then
Return $ret
EndIf
WEnd
EndFunc ;==>_WaitTcpResponse
Так надо в качестве теста принять файл через telnet и посмотретьУ меня GUI клиента не работает после входа в цикл, тем более задал опцию TrayIconDebug где видно что "застыло" на TCPRecv
CreatoR сказал(а):
While Not ;[проверяем, что cодержимое переменной $ret не содержит признаков конца передачи]
While Not StringRegExp ($ret, "ОК \[бла-бла\]")
Автор темы | Похожие темы | Форум | Ответы | Дата |
---|---|---|---|---|
![]() |
[Сеть, интернет] Отключения принятия пакетов | Общие вопросы по AutoIt | 0 | |
O | [Сеть, интернет] Сервер не отправляет пакеты после принятия | Общие вопросы по AutoIt | 0 |