Цикл приема сокета никогда не возвращается - PullRequest
0 голосов
/ 21 июля 2011

У меня есть цикл, который читает из сокета в 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

Ответы [ 2 ]

1 голос
/ 21 июля 2011

Я считаю, что единственный способ справиться с этой ситуацией в сокете - установить тайм-аут.

Следующая ссылка содержит немного информации, но она находится на http-сокете: lua http socket timeout

Также есть этот (9.4 - Непрециативная многопоточность): http://www.lua.org/pil/9.4.html

И этот вопрос: http://lua -list.2524044.n2.nabble.com/luasocket-howto-read-write-Non-blocking-TPC-socket-td5792021.html

Хорошее обсуждение Socket можно найти по этой ссылке:

http://nitoprograms.blogspot.com/2009/04/tcpip-net-sockets-faq.html

Это .NET, но понятия общие.

0 голосов
/ 22 июля 2011

См. Обновление 3. Поскольку последняя часть данных всегда одинакова, я могу читать блок байтов и каждый раз проверять, имеет ли этот блок шаблон.Если у него есть шаблон, это будет означать, что это конец данных, добавить к выходной переменной и выйти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...