2017-02-24 3 views
2

Problèmeserveur luasocket: accept() délai d'attente (TCP)

Après LuaSocketIntroduction j'ai réussi à obtenir le fonctionnement du serveur. J'ai également réussi à me connecter du côté client. J'ai remarqué, cependant, que le script du serveur se bloque jusqu'à ce que server:accept() obtienne la connexion.

recherche

LuaSocketReference spécifie:

Utilisez la méthode setTimeout ou accepter peut bloquer jusqu'à ce qu'un autre client se présente.

Ceci est même inclus dans le code d'exemple. Cependant, client:settimeout(10) est appelé après local client = server:accept() afin que le script soit bloqué avant d'avoir atteint ce point. J'ai lu que cela pourrait être travaillé par le multithreading, mais cela semble être une exagération.

Questions

  1. Comment vous provoquez le script serveur pour arrêter attente de connexion et passer à autre chose?
  2. Comment me protéger des problèmes similaires avec client:receive() (côté serveur) et tcp:receive() (côté client) (ou client:settimeout(10) prend-il soin de cela)?

code

serveur (de 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 (suit 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() 

Répondre

1

Vous devriez pouvoir utiliser server:timeout() avant d'appeler server:accept():

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

Cette imprime nil timeout pour moi si aucune demande est disponible en 2 secondes.