Ermitteln, ob die Internetverbindung besetzt ist

8

Wir entwickeln eine Anwendung, die auf dem PC installiert wird und einige Uploads und Downloads von und zu unserem Server durchführt. Eine der Anforderungen besteht darin, zu erkennen, ob die Internetverbindung derzeit besetzt ist (sagen wir über 50% Auslastung) und wenn dies der Fall ist, muss sie sich zurückziehen und es ein anderes Mal versuchen. Der Hauptgrund ist, sicherzustellen, dass die App die Benutzererfahrung nicht beeinträchtigt, wenn sie mitten im Spiel sind, Online-Filme ansehen oder Dateien aggressiv herunterladen.

Nachdem ich viel über Google und SO nachgedacht und geforscht habe, habe ich immer noch keinen guten Weg gefunden, dies zu implementieren, also habe ich beschlossen, das hier rauszuwerfen. Die Anwendung ist in C #, .NET 4.0 implementiert und ich suche nach allen Formen von Antworten - entweder Implementierung in C # oder anderen Sprachen, Pseudo-Logik oder Ansatz, wie zu erreichen - Messung der Internet-Verkehrsnutzung auf lokaler PC mit ausreichender Genauigkeit.

Um Doppelarbeit zu vermeiden, habe ich diese bisher versucht (und warum sie nicht geeignet sind)

  • Verwenden Sie WMI, um Netzwerkstatistiken abzurufen. Die meisten SO-Posts und -Lösungen gibt es seither als Ansatz, aber sie erfüllen nicht unsere Anforderung, da das Messen von gesendeten / empfangenen Bytes gegen Netzwerkschnittstellenkapazität (z. B. 1 GB Ethernet-Karte) ein gutes Maß für den LAN-Verkehr darstellt aber nicht für den Internetverkehr (wo die tatsächliche Internetbandbreite vielleicht nur 8Mbps ist)
  • Verwendung von. NET Network Information Statistics oder Leistungsindikator - ergeben ähnliche Messwerte zu den oben genannten haben daher die gleichen Mängel
  • Verwenden Sie ICMP (Ping) und messen Sie RTT. Es wurde vorgeschlagen, dass 400ms RTT gilt als langsam und gute Anzeige für beschäftigt Netzwerk, aber mir wurde gesagt, dass Benutzer mit Modem (ja, wir müssen das unterstützen), die Verwendung von Reverse-Proxy oder Mikrowelle Link oft Ping über das daher nicht gut messen
  • Starten Sie den Download einer bekannten Datei und messen Sie die Geschwindigkeit - dies erzeugt Traffic, den wir zu vermeiden versuchen. Auch wenn diese Prüfung oft genug durchgeführt wird, erzeugt unsere Anwendung sehr viel Internetverkehr - was wiederum nicht ideal ist / li>
  • MOD: BITS verwenden - dieser Dienst kann auf dem Benutzer-PC deaktiviert werden, erfordert Gruppenrichtlinienänderungen und nimmt an, dass der Server IIS ist (mit benutzerdefinierter Konfiguration) und in unserem Fall ist unser Server nicht IIS

Also hier ist es, ich bin alle verwirrt und auf der Suche nach einem Rat. Ich habe den Fragetext hervorgehoben, damit ihr euch nicht verirrt und euch fragt, was die Frage ist. Danke.

    
Fadrian Sudaman 22.02.2012, 12:08
quelle

3 Antworten

5

Sie können UPnP verwenden, um den Router abzufragen und die Anzahl der über das Netzwerk gesendeten und empfangenen Bytes abzurufen. Sie können diesen Wert auf dem Router überprüfen, um festzustellen, um was für eine Aktivität es sich handelt. Leider scheint diese Funktionalität nicht gut dokumentiert zu sein, aber es ist möglich, UPnP-Kommunikationsfunktionen innerhalb einer C # -Anwendung zu implementieren. Sie müssen UDP verwenden, um nach dem Router zu suchen (UPnP discover). Wenn Sie das Gerät gefunden haben, können Sie dessen Funktionalität abfragen und anschließend die Anzahl der gesendeten und empfangenen Pakete für das Internet Gateway-Gerät mit einem WebClient (TCP) abfragen.

%Vor% %Vor%     
IDWMaster 22.02.2012, 12:29
quelle
4

Haben Sie in Betracht gezogen, Background Intelligent Transfer Service ( BITS) . Es ist entworfen, um diesen Job bereits zu machen:

  

Der Background Intelligent Transfer Service (BITS) überträgt Dateien (Downloads oder Uploads) zwischen einem Client und einem Server und stellt Fortschrittsinformationen für die Übertragungen bereit. Sie können auch Dateien von einem Peer herunterladen.

und

  

Behalten Sie die Reaktionsfähigkeit anderer Netzwerkanwendungen bei.

Ich bin mir nicht sicher, ob es eine verwaltete Schnittstelle dazu gibt (ich kann einen Verweis auf Powershell-Cmdlets sehen), daher müssen Sie möglicherweise COM-Interop verwenden, um es zu verwenden.

    
Damien_The_Unbeliever 22.02.2012 13:24
quelle
1

Wenn Sie annehmen, dass Sie auf Windows-PCs abzielen (wie Sie gesagt haben, dass Sie in C # entwickelt haben), haben Sie sich BITS , der intelligente Hintergrundübertragungsdienst?

Es gibt Beispiele dafür, wie man mit C # in MSDN und anderswo, z. Ссылка

    
Grhm 22.02.2012 13:25
quelle