2014-03-25 35 views
3

我想在Corona SDK中使用LuaSocket庫來測試互聯網連接的存在。LuaSocket測試互聯網連接的存在

我發現這個解決方案:

function test()   
    local connection = socket.tcp() 
    connection:settimeout(1000) 
    local result = connection:connect("www.google.com", 80) 
    connection:close() 
    if (result) then return true end 
    return false 
end 

但有一個問題:如果有一個壞的/不穩定的連接,該程序被阻止,直至插槽運行(各種秒)。

所以,我想是這樣的:

connection:settimeout(1000, 't') 

但它是非常不準確的(它返回false那裏有一個小的網絡延遲)。有一個更好的方法?

也許使插座不被阻塞?

更新2: 我嘗試這樣的代碼,但我真的不能明白,如果它是有道理的......

local socket = require("socket") 
function test(callback, timeout) 
    if timeout == nil then timeout = 1000 end 
    local connection = socket.tcp() 
    connection:settimeout(0) 
    connection:connect("www.google.com", 80) 
    local t 
    t = timer.performWithDelay(10, function() 
     local r = socket.select({connection}, nil, 0) 
     if r[1] or timeout == 0 then 
      connection:close() 
      timer.cancel(t) 
      callback(timeout > 0) 
     end 
     timeout = timeout - 10 
    end , 0) 
end 

它總是返回「無連接」

回答

4

你可以採取一看network.setStatusListener

你不能使用IP地址,但它似乎你不關心這一點。

+0

哇,我不知道該功能! 它似乎不適用於所有設備......你知道哪一個不支持? – ProGM

+0

我不知道哪些設備不受支持,但是您可以在運行時使用此http://docs.coronalabs.com/api/library/network/canDetectNetworkStatusChanges.html進行檢查。 –

5

最後,我找到了一種方法,使其工作的所有設備。謝謝hades2510:

--------------------------------------- 
-- Test connection to the internet 
--------------------------------------- 
local socket = require("socket") 

local connection = {} 
local function manual_test(callback, timeout) 
    if timeout == nil then timeout = 1000 end 
    local connection = assert(socket.tcp()) 
    connection:settimeout(0) 
    local result = connection:connect("www.google.com", 80) 
    local t 
    t = timer.performWithDelay(10, function() 
     local r, w, e = socket.select(nil, {connection}, 0) 
     if w[1] or timeout == 0 then 
      connection:close() 
      timer.cancel(t) 
      callback(timeout > 0) 
     end 
     timeout = timeout - 10 
    end , 0) 
end 
local isReachable = nil 
function connection.test(callback) 
    if network.canDetectNetworkStatusChanges then 
     if isReachable == nil then 
      local function networkListener(event) 
       isReachable = event.isReachable 
       callback(isReachable) 
      end 
      network.setStatusListener("www.google.com", networkListener) 
     else 
      callback(isReachable) 
     end 
    else 
     manual_test(callback) 
    end 
end 
return connection 

https://gist.github.com/ProGM/9786014