7
votes

Obtenir ping latence de l'hôte

J'essaie d'obtenir la latence de l'hôte pendant un bon moment et je suis coincé dans. Déjà essayé Simple Ping , mais semble qu'il ne renvoie pas la latence. Le plus proche que j'ai fait était quand j'utilise le TKC-Pingtest pour Mac OS. Cela fonctionne parfaitement, mais uniquement dans l'iPhone Simulator, car lorsque vous utilisez l'iPhone, j'obtiens une erreur en raison du correctif "/ sbin / ping" utilise TKC. Outre ces deux, j'ai déjà essayé beaucoup d'autres et n'a rien eu.


2 commentaires

Pourquoi ne pouvez-vous pas simplement adapter le code exemple de ping simple que vous avez lié? C'est sûrement aussi simple que l'ajout d'un NSTIMER à temps combien de temps il faut de l'envoi de votre ping pour recevoir une réponse?


Je ne pense pas que je te comprenne. Je n'ai pas utilisé Nstimer. Le simple ping ne retourne pas la latence.


4 Réponses :


8
votes

Vous pouvez facilement étendre de simples ping pour calculer la latence. SimplePing.h définit le protocole SimpleDelegate. Il existe deux méthodes d'intérêt - didsendpacket et didreceivepingResponsePacket . Une implémentation naïve pour le synchronisation de la latence serait XXX

Je dis que ceci est une implémentation de Niave, car elle ne traite pas du cas où un autre paquet est envoyé avant la réception de la réponse ou où les paquets sont chuté. Pour faire face à cela, vous devez examiner les données de paquet pour déterminer si le numéro de séquence était cohérent entre les événements d'envoi et de réception.


1 commentaires

Je fixe mon réseauTestViewController.h sur @interface NetworkTestViewController: UitailViewController et mettez en œuvre ces deux méthodes. Lorsque je démarre le sinistre, il n'appelle pas les méthodes de ma classe.



20
votes

Suivant est un exemple de travail complet qui pique exactement une fois l'adresse donnée, puis renvoie le temps de ping dans les milisecondes:

objectif-c strong> p> xxx pré>

Et exemple d'utilisation est la suivante: p> xxx pré>

Swift strong> p> xxx pré>

utilisation: p >

SimplePingClient.pingHostname("www.apple.com") { latency in

            print("Your latency is \(latency ?? "unknown")")
        }


3 commentaires

Ce que je cherchais! :)


Mise en œuvre fantastique!


Merci d'un exemple très utile.



4
votes

SWIFT 3 Mise en œuvre de Réponse HRIS.PO:

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)
    }

}


0 commentaires

3
votes

J'ai pris le beau code de @ hris.to (merci!) Et j'ai mis à jour la dernière version Swift. Pensé que je partagerais:

Swift 5.2 xxx

utilisation: xxx

Remarques:

  • Ajouter à votre projet Xcode Le simpleping.h et SimplePing.m Fichiers de développeur.apple.com Simplement
  • let Xcode créer un en-tête de pontage et ajoutez la ligne #include "simpleping.h"

0 commentaires