2017-02-24 4 views
2

ProblemLuaSocket Server: accept() Timeout (TCP)

Nach LuaSocketIntroduction ich den Server zum Laufen bringen verwaltet. Ich habe es auch geschafft, mich von der Clientseite aus zu verbinden. Mir ist jedoch aufgefallen, dass das Server-Skript friert, bis server:accept() die Verbindung bekommt.

Forschung

LuaSocketReference angibt:

Über die SetTimeout Methode oder akzeptieren könnte blockieren, bis ein anderer Client erscheint.

Dies ist sogar im Beispielcode enthalten. client:settimeout(10) wird jedoch nach local client = server:accept() aufgerufen, sodass das Skript blockiert wird, bevor es diesen Punkt erreicht.

Ich habe gelesen, dass dies durch Multithreading bearbeitet werden könnte, aber das scheint eine Übertreibung zu sein.

Fragen

  1. Wie führen Sie das Server-Skript wartet auf Verbindung zu stoppen und weiterziehen?
  2. Wie bewahre ich vor ähnlichen Problemen mit client:receive() (Server-Seite) und tcp:receive() (Client-Seite) (oder client:settimeout(10) kümmert sich darum)?

-Code

Server (von LuaSocketIntroduction)

-- load namespace 
local socket = require("socket") 
-- create a TCP socket and bind it to the local host, at any port 
local server = assert(socket.bind("*", 0)) 
-- find out which port the OS chose for us 
local ip, port = server:getsockname() 
-- print a message informing what's up 
print("Please telnet to localhost on port " .. port) 
print("After connecting, you have 10s to enter a line to be echoed") 
-- loop forever waiting for clients 
while 1 do 
    -- wait for a connection from any client 
    local client = server:accept() 
    -- make sure we don't block waiting for this client's line 
    client:settimeout(10) 
    -- receive the line 
    local line, err = client:receive() 
    -- if there was no error, send it back to the client 
    if not err then client:send(line .. "\n") end 
    -- done with client, close the object 
    client:close() 
end 

Client (folgt this answer)

local host, port = "127.0.0.1", 100 
local socket = require("socket") 
local tcp = assert(socket.tcp()) 

tcp:connect(host, port); 
--note the newline below 
tcp:send("hello world\n"); 

while true do 
    local s, status, partial = tcp:receive() 
    print(s or partial) 
    if status == "closed" then break end 
end 
tcp:close() 

Antwort

1

sollten Sie in der Lage sein server:timeout() zu verwenden, bevorAufruf:

server:settimeout(2) 
local client, err = server:accept() 
print(client, err) 

Dies druckt nil timeout für mich, wenn keine Anfrage in 2 Sekunden kommt.