У меня есть цикл, который читает из сокета в Lua:
socket = nmap.new_socket()
socket:connect(host, port)
socket:set_timeout(15000)
socket:send(command)
repeat
response,data = socket:receive_buf("\n", true)
output = output..data
until data == nil
По сути, последняя строка данных не содержит символа "\ n", поэтому никогда не читается из сокета.Но этот цикл просто зависает и никогда не завершается.Мне нужно, чтобы он возвращался всякий раз, когда разделитель "\ n" не распознается.Кто-нибудь знает способ сделать это?
Приветствия
Обновлено , чтобы включить код сокета
Обновление2
OKЯ справился с первоначальной проблемой ожидания символа "\ n" с помощью метода receive_bytes.
Новый код:
--socket set as above
repeat
data = nil
response,data = socket:receive_bytes(5000)
output = output..data
until data == nil
return output
Это работает, и я получаю большой полный блок данных обратно.Но мне нужно уменьшить размер буфера с 5000 байт, так как это используется в рекурсивной функции, и использование памяти может быть очень высоким.Однако у меня все еще есть проблемы с моим условием «до», и если я уменьшу размер буфера до размера, который потребует зацикливания метода, он просто зависнет после одной итерации.
Update3 Я справился с этой проблемой, используя string.match и receive_bytes.Я беру не менее 80 байтов за раз.Затем string.match проверяет, содержит ли переменная данных определенный шаблон.Если так, то это выходит.Это не самое чистое решение, но оно работает для того, что мне нужно.Вот код:
repeat
response,data = socket:receive_bytes(80)
output = output..data
until string.match(data, "pattern")
return output