IA
Size: a a a
IA
S
S
S
DF
S
A
S
sock:settimeout(60)S
accept), и второй таймаут для каждого соединения по отдельности. Задаются одинаково.local tcp = socket.bind(bla, bla)
-- таймаут для акцепта
tcp:settimeout(0)
local clients = {}
function update()
-- добавляем новых клиентов
local sock = tcp:accept()
while sock do
local ip, port = sock:getpeername()
-- таймаут для receive
sock:settimeout(0)
clients[sock] = {ip = ip, port = port}
sock = tcp:accept()
end
for sock, info in pairs(clients) do
local data, status = sock:receive('*l')
while data do
print(data, status, err)
-- что-то делаем с данными
data, status, err = sock:receive('*l')
end
if status == 'closed' then
print('Client disconnected', info.ip, info.port)
sock:close()
clients[sock] = nil
end
end
end
while true do
update()
socket.sleep(.1)
end
Собственно, простейший неблокирующий сервер на много клиентов, принимающий данные построчно (разделитель сообщений — [\r\n]).S
'PING', на которую сервер среагирует 'PONG'-ом, например. Но в целом, при обрыве, tcp норм понимает что произошёл обрыв.A
'PING', на которую сервер среагирует 'PONG'-ом, например. Но в целом, при обрыве, tcp норм понимает что произошёл обрыв.S
local tcp = socket.connect(bla, bla)
tcp:settimeout(60)
tcp:setoption('keepalive', true)
while true do
local data, status = tcp:receive()
if data then
-- что-то делаем с данными
end
if status == 'closed' then
print('Server disconnected', tcp:getperrname())
tcp:close()
tcp = socket.connect(bla, bla)
tcp:settimeout(60)
tcp:setoption('keepalive', true)
end
socket.sleep(.1)
endᴠ