Get ping latency from host

前端 未结 4 1762
轻奢々
轻奢々 2020-12-09 22:53

I\'m trying to get the latency from host for a pretty good time and I\'m stuck in. Already tried Simple Ping , but seems it doesn\'t return the latency. The closest I\'ve d

4条回答
  •  独厮守ぢ
    2020-12-09 23:10

    Swift 3 implementation of hris.to's answer:

    import Foundation
    public typealias SimplePingClientCallback = (String?)->()
    
    public class SimplePingClient: NSObject {
        fileprivate static let singletonPC = SimplePingClient()
    
        fileprivate var resultCallback: SimplePingClientCallback?
        fileprivate var pingClinet: SimplePing?
        fileprivate var dateReference: Date?
    
        public static func pingHostname(hostname: String, andResultCallback callback: SimplePingClientCallback?) {
            singletonPC.pingHostname(hostname: hostname, andResultCallback: callback)
        }
    
        public func pingHostname(hostname: String, andResultCallback callback:  SimplePingClientCallback?) {
            resultCallback = callback
            pingClinet = SimplePing(hostName: hostname)
            pingClinet?.delegate = self
            pingClinet?.start()
        }
    }
    
    extension SimplePingClient: SimplePingDelegate {
    
        public func simplePing(_ pinger: SimplePing, didSendPacket packet: Data, sequenceNumber: UInt16){
            dateReference = Date()
        }
    
        public func simplePing(_ pinger: SimplePing, didStartWithAddress address: Data) {
            pinger.send(with: nil)
        }
    
        public func simplePing(_ pinger: SimplePing, didFailWithError error: Error) {
            resultCallback?(nil)
        }
    
        public func simplePing(_ pinger: SimplePing, didReceiveUnexpectedPacket packet: Data) {
            pinger.stop()
            resultCallback?(nil)
        }
    
        public func simplePing(_ pinger: SimplePing, didReceivePingResponsePacket packet: Data, sequenceNumber: UInt16) {
            pinger.stop()
            guard let dateReference = dateReference else { return }
    
          //timeIntervalSinceDate returns seconds, so we convert to milis
            let latency = Date().timeIntervalSince(dateReference) * 1000
            resultCallback?(String(format: "%.f", latency))
        }
    
        public func simplePing(_ pinger: SimplePing, didFailToSendPacket packet: Data, sequenceNumber: UInt16, error: Error) {
            pinger.stop()
            resultCallback?(nil)
        }
    
    }
    

提交回复
热议问题