У меня есть задача - передать информационный пакет между двумя программами. Открыл справку, поразбирался с примерами.
Накатал два таких скрипта:
Сервер:
Клиент:
Компилирую и запускаю сервер.
Затем запускаю из IDE клиент.
На сервере получаю после запуска клиента пустую строку. И все.
Я хочу реализовать такой алгоритм. Установлен факт соединения через TCPAccept. После факта установки соединения нужно работать на прием, пока данные будут идти и куда-то их сливать (в массив, например, или в файл - не суть важно). После того как порт закроется - выходим из цикла и обрабатываем полученные данные. И после обратотки чего-нибудь отправляю клиенту - хорошо мол, или повторите передачу.
Скопились вопросы, которые непонятны из мануала.
1) Непонятно как работает TCPRecv.
Установлен факт соединения через TCPAccept. После этого я получаю пустую строку и почему-то вываливаюсь из цикла TCPRecv. Как я оттуда выхожу, если строка пустая!!! Как зациклить приемник? В идеале надо намутить свой протокол. Будет старт-байт, байт размера посылки и стоп байт. И вот все это дело получим, обсчитав и проверив, что стоп соответствует стопу - типа тогда выходим из цикла. Но как тогда мне организовать цикличность? Вот послал я сервер, настроенному для приема 4кбайт пакет через TCPSend пакет из тридцати байт - он их целиком получит? Или может порвать? С какой тогда периодичностью TCPRecv дергать? Как осуществить паузу между чтениями - через Sleep?
2) Откуда получает данные TCPRecv? По идее какой-то буфер же где-то должен быть в системе? Как понять его размер? Не вопрос, если я захочу получить пару килобайт. А если мне надо отправить бинарный файл размером 10 мегабайт? Соответственно - а TCPSend можно такой объем засунуть считав файл через ReadFile или надо будет как-то файл разбивать на куски и их отправлять?
Ну вот как-то так немного сумбурно.
Но сильно хочется работать по сети)
Для начала хочу сделать передачу файла с одного компа на другой с командой куда этот файл положить на приемном компе =) Но пока никак не могу осилить простую однократную передачу.
Накатал два таких скрипта:
Сервер:
Код:
ServerASH()
Func ServerASH()
TCPStartup()
Local $ip = "127.0.0.1"
Local $port = 65432
Local $lsocket = TCPListen($ip, $port, 100)
If @error Then
MsgBox(4096 + 16, "Сервер", "Не удалось прослушать сокет, @error = " & @error)
TCPCloseSocket($lsocket)
TCPShutdown()
EndIf
Local $socket = 0
Do
$socket = TCPAccept($lsocket)
If @error Then
MsgBox(4096 + 16, "Сервер", "Не удалось принять входящее соединение, @error = " & @error)
Return False
EndIf
Until $socket <> -1
Do
$din = TCPRecv($socket, 2048, 1)
Until StringCompare($din,"") = 0
MsgBox(4096, "Сервер", BinaryToString($din, 4))
TCPCloseSocket($socket)
TCPCloseSocket($lsocket)
TCPShutdown()
EndFunc
Клиент:
Код:
ClientASH()
Func ClientASH()
TCPStartup()
Local $ip = "127.0.0.1"
Local $port = 65432
Local $socket = TCPConnect($ip, $port)
If @error Then
MsgBox(4096 + 16, "Клиент", "Не удалось подключиться, @error = " & @error)
TCPCloseSocket($socket)
TCPShutdown()
Else
MsgBox(4096, "Клиент", "Успешное подключение")
Local $dout = "HELLO!!!"
TCPSend($socket, StringToBinary($dout, 4))
EndIf
TCPShutdown()
EndFunc
Компилирую и запускаю сервер.
Затем запускаю из IDE клиент.
На сервере получаю после запуска клиента пустую строку. И все.
Я хочу реализовать такой алгоритм. Установлен факт соединения через TCPAccept. После факта установки соединения нужно работать на прием, пока данные будут идти и куда-то их сливать (в массив, например, или в файл - не суть важно). После того как порт закроется - выходим из цикла и обрабатываем полученные данные. И после обратотки чего-нибудь отправляю клиенту - хорошо мол, или повторите передачу.
Скопились вопросы, которые непонятны из мануала.
1) Непонятно как работает TCPRecv.
Установлен факт соединения через TCPAccept. После этого я получаю пустую строку и почему-то вываливаюсь из цикла TCPRecv. Как я оттуда выхожу, если строка пустая!!! Как зациклить приемник? В идеале надо намутить свой протокол. Будет старт-байт, байт размера посылки и стоп байт. И вот все это дело получим, обсчитав и проверив, что стоп соответствует стопу - типа тогда выходим из цикла. Но как тогда мне организовать цикличность? Вот послал я сервер, настроенному для приема 4кбайт пакет через TCPSend пакет из тридцати байт - он их целиком получит? Или может порвать? С какой тогда периодичностью TCPRecv дергать? Как осуществить паузу между чтениями - через Sleep?
2) Откуда получает данные TCPRecv? По идее какой-то буфер же где-то должен быть в системе? Как понять его размер? Не вопрос, если я захочу получить пару килобайт. А если мне надо отправить бинарный файл размером 10 мегабайт? Соответственно - а TCPSend можно такой объем засунуть считав файл через ReadFile или надо будет как-то файл разбивать на куски и их отправлять?
Ну вот как-то так немного сумбурно.
Но сильно хочется работать по сети)
Для начала хочу сделать передачу файла с одного компа на другой с командой куда этот файл положить на приемном компе =) Но пока никак не могу осилить простую однократную передачу.