LuaSocket用于测试互联网连接的存在性。

我正在使用LuaSocket库测试Corona SDK中的互联网连接是否存在。

我找到了这个解决方案:

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

它总是返回“没有连接”。

点赞
用户2054602
用户2054602

你可以查看 network.setStatusListener

但是它不支持使用 IP 地址,但看起来你并不关心这一点。

2014-03-26 13:15:41
用户2837813
用户2837813

最终我找到了一种方法,可以在所有设备上运行。感谢 hades2510:

---------------------------------------
-- 测试连接到互联网
---------------------------------------
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

2014-03-26 14:52:01