2013-07-24 3 views
1

Всякий раз, когда я получаю TCP-сообщения, используя что-то вроде этого:Luasocket TCP перестает слушать после того, как г п г п

local socket=require "socket" 
local sv=socket.bind("*",1337) 
function love.update(dt) 
    local s=sv:accept() 
    while true do 
     local s,e=s:receive() 
     print(e or s) 
    end 
end 

Он отлично работает с \r\n разнесенных заголовков HTTP, но когда я пытаюсь POST HTTP к нему, я получаю заголовки мелкие, но не данные, ведьма после и пустой строки (\ г \ п \ г \ п) он делает то же самое, когда я использовать это в качестве клиента:

s.socket_write(h,"test1\r\ntest2\r\n\r\ntest3") -- (not luasocket) 

Я вижу test1 и test2

Я попытался возиться с функцией setOption, но он не работал

Есть ли способ получить данные?

ответ

2

Я не уверен, что вы ожидаете, но «режим» по умолчанию для чтения одной строки и потому, что ваша строка "test1\r\ntest2\r\n\r\ntest3" не имеет символа новой строки в конце концов, receive вызова ждет этой новой строки.

Обычно после чтения заголовков вы уже знаете длину содержимого, которое хотите прочитать, поэтому вы можете сделать s:receive(number_of_bytes_to_read) (по крайней мере, это то, что я делаю, и оно работает без каких-либо проблем).

+0

Спасибо, я уже узнал, как мне пришлось использовать s: receive (headers.Content-Length), когда был обнаружен POST. – PixelToast

0

Вы пробовали заполнить socket.receive() шаблон аргумент? [1]

Не знаете, какой из них по умолчанию, но вы можете подумать об использовании socket.receive('*a') и разбор этих новых строк позже.

[1] http://w3.impa.br/~diego/software/luasocket/tcp.html#receive

+0

Используя * обыкновенный даже возврат test1 или test2, он просто возвращается, когда гнездо закрывается. – PixelToast

Смежные вопросы