2014-10-17 67 views
3

我有以下代碼:luasocket的settimeout()如何工作?

function Server:run() 
    print("Running.") 
    self.running = true 
    while self.running do 
     if self.client == nil then 
      self.client = self.socket:accept() 
      print("Client connected.") 
      self.client:settimeout(10) 
     end 
     local line, err = self.client:receive() 
     if err then 
      print("Error: " .. err) 
     elseif line == "quit" then 
      print("Quitting.") 
      self.client:close() 
      self.running = false   
     else 
      print("Received: " .. line) 
     end 
    end 
    self:terminate() 
end 

我想到的是,當self.client:接收()被調用時,服務器會等待10秒,直到它有一個消息,然後繼續在它的途中。

但是,這不是我經歷的行爲。無論超時設置爲什麼值,服務器都會立即生成超時錯誤,並且根本不會等待來自客戶端的消息。

我懷疑我誤解了一些東西。任何見解都會被認可。謝謝。


全部代碼在這裏:

服務器:http://pastie.org/9659701

主:http://pastie.org/9659703


回答

0

如預期中的代碼對我的作品(在Windows,LuaJIT 2.0.2,luasocket 3.0- RC1);我在下面的獨立腳本測試:

local socket = require "socket" 
local server = assert(socket.bind("*", 3333)) 
local client = server:accept() 
print("accepted connection; waiting for data...") 
client:settimeout(10) 
local start = os.time() 
local line, err, partial = client:receive("*l") 
if line then 
    print(("received '%s'; echoing back..."):format(line)) 
    client:send(line.."\n") 
else 
    print(("received error '%s' after %.2f seconds."):format(err, os.time()-start)) 
end 
client:close() 

您可以運行telnet localhost 3333和應該看到「接受的連接;等待數據...」;如果我不發送任何東西,10.00秒後我會收到「收到錯誤」超時。「,這正是我所期望的。

我會檢查是否有邏輯錯誤,self.client從來沒有nil你的情況,你不叫settimeout。如果這仍然沒有幫助,請創建一個可以使用love2d運行的獨立示例(例如,我看不到您撥打bind的位置)。

+0

使用完整的代碼進行編輯。 – 2014-10-18 20:24:40