【问题标题】:LuaSocket to test presence of internet connectionLuaSocket 测试互联网连接的存在
【发布时间】:2014-03-25 15:34:30
【问题描述】:

我正在尝试使用 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

它总是返回“无连接”

【问题讨论】:

    标签: sockets lua coronasdk luasocket


    【解决方案1】:

    最后我找到了一种让它在所有设备上都工作的方法。感谢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

    【讨论】:

      【解决方案2】:

      您可以查看network.setStatusListener

      您不能使用 IP 地址,但您似乎并不关心这一点。

      【讨论】:

      • 哇,我不知道那个功能!它似乎不适用于所有设备...您知道不支持哪个设备吗?
      • 我不知道哪些设备不受支持,但您可以在运行时使用此docs.coronalabs.com/api/library/network/… 进行检查。
      猜你喜欢
      • 2018-11-06
      • 2014-01-21
      • 1970-01-01
      • 2014-08-31
      • 2012-01-17
      • 2010-10-25
      • 2011-08-25
      • 1970-01-01
      相关资源
      最近更新 更多