Proxy- Checker

02/05/2015 15:58 The_Dentist#1
Hallo,

Ich habe mal eine Frage und zwar schreibe ich gerade ein Methode die eine Liste mit Proxys durchgeht. Die Methode soll diejenigen Proxys einer Liste hinzufügen, welche erfolgreich getestet wurden.

Die Methode wird in einem Thread aufgerufen, nun muss ich ein Feedback von der Methode bekommen, welches mir dann sagt, wann der Thread beendet werden kann.

1.)Jetzt ist das Problem, dass ich nicht weiß wie ich das am besten umsetze, zudem bin ich mir nicht mal sicher, ob die Proxys geprüft werden.
2.) Kann ich da irgendwie eine Progressbar einbauen, welche mit jedem geprüften Proxy weiterläuft?




Wäre über eure Hilfe sehr dankbar!

Gruß

The_Dentist!
02/05/2015 16:56 Else#2
Quote:
Originally Posted by The_Dentist View Post
1.)Jetzt ist das Problem, dass ich nicht weiß wie ich das am besten umsetze, zudem bin ich mir nicht mal sicher, ob die Proxys geprüft werden.
Task?

Quote:
Originally Posted by The_Dentist View Post
2.) Kann ich da irgendwie eine Progressbar einbauen, welche mit jedem geprüften Proxy weiterläuft?
Geprüfte Proxys / Proxy-Anzahl * 100 = Prozentzahl.
02/05/2015 17:32 The_Dentist#3
Mal was anderes, mit einem Thread dauert das logischerweise sehr lange. Kann ich die Liste auch mit mehreren Threads durchgehen ohne, dass sich die einzelnen Threads überlappen und die gleichen Proxys überprüfen? Habe mit Tasks noch nicht gearbeitet, deswegen habe ich das mit einem Thread gemacht..

Gruß
02/05/2015 18:05 Mostey#4
Dein try-catch Block ist sehr fragwürdig, weißt du denn überhaupt was eine Exception ist und worin der Sinn davon liegt?

UseDefaultCredentials kann raus sofern der genutzte Proxy keine Authentifizierung erfordert

Übrigens liegst du richtig, dein Code prüft nicht wirklich zuverlässig, ob ein Proxy funktioniert oder nicht. Es kann klappen, kommt aber in der Regel auf die Implementierung der HttpWebRequest Klasse an. Ich würde auf jeden Fall noch den Statuscode der Anfrage überprüfen. Alles andere wie HTTP OK (200) ist eigentlich ungültig.

Du solltest dir übrigens auch ne Funktion schreiben die eine Aktion automatisch im Thread der GUI ausführt um nicht jedes mal eine Variable anlegen zu müssen wie du es hier tust:

Code:
MethodInvoker action = delegate { textBox3.Text += "Proxies werden überprüft!"; };
Ich nutze beispielsweise eher so etwas:

Code:
Execute(() => textBox3.Text += "Proxies werden überprüft!");

Quote:
Originally Posted by The_Dentist View Post
mit einem Thread dauert das logischerweise sehr lange.
Mehrere Threads sind nicht unbedingt schneller wie ein einzelner Thread. In der Regel sollte man aber Aufgaben die länger dauern in einem anderen Thread ausführen, wenn man andere Routinen im Hauptthread hat, die konsistent laufen müssen. Eine GUI friert beispielsweise ein, wenn du im selben Thread eine solche Aufgabe startest weil die Windows Nachrichten Schleife durch die laufende Aufgabe nicht mehr bearbeitet wird.

Quote:
Originally Posted by The_Dentist View Post
Kann ich die Liste auch mit mehreren Threads durchgehen ohne, dass sich die einzelnen Threads überlappen und die gleichen Proxys überprüfen? Habe mit Tasks noch nicht gearbeitet, deswegen habe ich das mit einem Thread gemacht..
Zwischen Tasks und Threads besteht nicht viel Unterschied, Tasks nehmen sich einen Thread aus dem ThreadPool von der .NET Runtime und führen die übergebene Funktion in diesem Thread aus.
02/05/2015 18:27 The_Dentist#5
Ja, normalerweise benutzt man Try Catch um Exceptions (Fehler) abzufangen und selbst zu entscheiden, was passiert. Beispiel wenn man Wissen will, ob etwas einen Null Exception wirft etc.
Die Try - Catch Anweisung habe ich so im Internet gefunden gehabt, ich werde diese eben ergänzen.

Danke!
02/05/2015 22:53 Terreox#6
Um mehrere Threads mit deinen Daten zu füttern, könntest du dir z.B. eine Methode schreiben, die bei Aufruf die nächste Proxyadresse zurückgibt.
Diese Methode sollte natürlich thread-safe sein, um unerwünschte Nebeneffekte beim Multithreading (z.B. das mehrere Threads die gleiche Adresse bekommen) zu vermeiden.

Die ganzen Adressen kannst du dann z.B. bei Start des Programmes in eine Variable laden (z.B. eine Queue), aber hier musst du selber schauen, was am besten geeignet ist. Wenn du zu viele Adressen im Speicher hälst, dann frisst die Anwendung u.U. zu viel Arbeitsspeicher und du musst dir ein dynamischeres Verfahren einfallen lassen (z.B. einen Teil laden, den Rest stück für stück bei bedarf nachladen oder so)
02/06/2015 17:12 Else#7
Ihr macht aber auch aus einer Mücke einen Elefanten.

Quote:
Erstelle für jeden Proxy, der Aufgerufen wird, einen eigenen Task. Das Ergebnis kannst du in einer Liste zwischenspeichern. Es würde sich günstiger weise anbieten, mit Await und Async zu arbeiten.

Die Proxys, die mit einem eigenen Task gestartet wurden, werden aus der Liste entfernt. So kann diese Adresse NICHT erneut aufgerufen werden bzw. sollte mit einem richtigen Ablauf auch gar nicht erst.
Eine Proxy-Liste, Stück für Stück zu laden dürfte eher sinnlos als sinnvoll sein, unterm strich. Denn die Daten musst Du sowieso nun einmal abrufen... ob ich jetzt lieber einmal darauf zugreife, oder gleich mehrere male, ist dann wohl doch ein entscheidender unterschied.
02/06/2015 18:41 YatoDev#8
Du kannst ja von jedem thread auf die Liste zugreifen. Deklarierst du die Liste also im richtigen gültigkeitsbereich kannst du die Liste auf 4 teile aufteilen.
Tasks sind besser weil sie gleichmäßig auf die cpu kerne aufgeteilt werden
02/06/2015 21:30 Else#9
Quote:
Originally Posted by »FlutterShy™ View Post
Du kannst ja von jedem thread auf die Liste zugreifen. Deklarierst du die Liste also im richtigen gültigkeitsbereich kannst du die Liste auf 4 teile aufteilen.
Warum denn die Liste aufteilen und immer wieder darauf zugreifen? Es frisst doch kein Brot, für jeden Proxy, einen eigenen Task laufen zu lassen. So hast du Verlässlichkeit, wenn EIN PROXY mal abschmieren sollte / oder was auch immer / etc.

Im Fall das du die Liste aufteilst, ist die Gefährdung der anderen Proxys garantiert. Deshalb die Frage: Wieso andere mit den Kopf in die schlinge stecken lassen, wenn es für einen völlig ausreichend ist!?


Etwas, was völlig Oversized ist, für einen Proxy-Prüfer, starte doch gleich für jeden Proxy einen eigenen Prozess, mittels IPC. Damit kannst du die Anwendung, als Hauptinstanz (Server) verwenden und jede weitere Instanz (Proxy Prüfung) als Client und beendest zum Schluss das ganze.
So kann jeder Proxy ruhig einmal abschmieren, länger brauchen, usw. und deine Hauptinstanz ist NICHT davon gefährdet, wenn eine Instanz (Proxy Prüfung) abstürzt. ;) :D
02/06/2015 22:44 YatoDev#10
Quote:
Originally Posted by Else View Post
Warum denn die Liste aufteilen und immer wieder darauf zugreifen? Es frisst doch kein Brot, für jeden Proxy, einen eigenen Task laufen zu lassen. So hast du Verlässlichkeit, wenn EIN PROXY mal abschmieren sollte / oder was auch immer / etc.

Im Fall das du die Liste aufteilst, ist die Gefährdung der anderen Proxys garantiert. Deshalb die Frage: Wieso andere mit den Kopf in die schlinge stecken lassen, wenn es für einen völlig ausreichend ist!?
es frisst doch kein brot immer wieder auf eine addresse zuzugreifen.
jo für jeden proxy einen task und dann erstmal ne 100k liste einlesen....
02/06/2015 23:07 tolio#11
Ich rate hier in diesem Kontext einfach mal zur vorsicht mit Tasks, denn diese laufen im internen ThreadPool und somit hat man keine Möglichkeit den gewünschten Grad der Parallelisierung durchzusetzen. So kann es passieren das man sich selber die Geschwindigkeit raubt. Testen kann man es sicher mit Tasks, wenn es aber nicht funktioniert sollte man das Konzept auf echte Threads umstellen. Die Kosten um Threads zu erstellen sind gegenüber den I/O Wartezeiten absolut zu vernachlässigen.

Desweiteren darf man [Only registered and activated users can see links. Click Here To Register...] nicht außer acht lassen.
02/06/2015 23:09 Else#12
Quote:
Originally Posted by »FlutterShy™ View Post
jo für jeden proxy einen task und dann erstmal ne 100k liste einlesen....
Wo ist das Problem? Bereits ausprobiert? Programmiere sauber, dann wirst doch auch keinerlei Probleme kriegen. es gibt viele Wege zur Lösung. Jedoch reden wir hier von einem "Proxy-Prüfer-auf-Existenz-und-oder-Verfügbarkeit". D.h. dürfte jederlei Lösung fast völlig oversized sein. :bandit:

Quote:
Originally Posted by tolio View Post
Desweiteren darf man [Only registered and activated users can see links. Click Here To Register...] nicht außer acht lassen.
Das lässt sich leicht umgehend. :cool:
02/07/2015 00:15 tolio#13
Ich bin mir nicht sicher was du bei dem DefaultConnectionLimit umgehen willst, das ist einfach nen Property welches man bei Bedarf anpassen sollte, deswegen hab ich darauf verwiesen.
02/07/2015 14:14 YatoDev#14
Quote:
Originally Posted by Else View Post
Wo ist das Problem? Bereits ausprobiert? Programmiere sauber, dann wirst doch auch keinerlei Probleme kriegen. es gibt viele Wege zur Lösung. Jedoch reden wir hier von einem "Proxy-Prüfer-auf-Existenz-und-oder-Verfügbarkeit". D.h. dürfte jederlei Lösung fast völlig oversized sein. :bandit:
so ein proxy kann schonmal brauchen bis er eine antwort zurückgibt. testet man nur den ping kann das schonmal bis zum timeout gehen(den man natürlich selber bestimmen sollte). das dauert nicht zulang aber ich kenne das nur von meinem pc das er in dieser zeit so massig viele threads erstellt hat und man sollte ja nicht den ganzen cpu auslasten.

Wenn man auch testen will ob der proxy richtig arbeitet dann muss man wohl oder übel einen http request über diesen senden und das dauert....
02/07/2015 22:17 D3luxe.#15
Quote:
Originally Posted by The_Dentist View Post
Hallo,

Ich habe mal eine Frage und zwar schreibe ich gerade ein Methode die eine Liste mit Proxys durchgeht. Die Methode soll diejenigen Proxys einer Liste hinzufügen, welche erfolgreich getestet wurden.

Die Methode wird in einem Thread aufgerufen, nun muss ich ein Feedback von der Methode bekommen, welches mir dann sagt, wann der Thread beendet werden kann.

1.)Jetzt ist das Problem, dass ich nicht weiß wie ich das am besten umsetze, zudem bin ich mir nicht mal sicher, ob die Proxys geprüft werden.
2.) Kann ich da irgendwie eine Progressbar einbauen, welche mit jedem geprüften Proxy weiterläuft?

Wäre über eure Hilfe sehr dankbar!

Gruß

The_Dentist!
Bin bis jetzt immer mit einer Proxy Klasse gut klar gekommen.
Eigenschaften: IP, Port, Checked, Working. Checked und Working natürlich false by default.

Dann eine List<Proxy> mit allen zu testenden Proxies, die natürlich public static sein sollte, wenn sie von mehreren Threads aus aufgerufen werden soll.

Dann in dem Stil durcharbeiten:

Außerdem gibt es mehrere Sachen, die du ändern solltest: Guck dir mal HttpClient an, der kann auch asynchron benutzt werden. Bietet sich für Multithreading an.

Außerdem würde ich die Proxies nicht auf google.com testen, weil sie immer auf die HTTPS-Seite weitergeleitet werden, und somit viele Proxies aussortiert werden, die SSL einfach nicht unterstützen, aber mit HTTP funktionieren würden.
Probiers mal selbst aus: [Only registered and activated users can see links. Click Here To Register...]
Als Alternative kannst du [Only registered and activated users can see links. Click Here To Register...] nehmen, das ist 'normales' HTTP.

Tasks habe ich nie gerne benutzt, auch, weil 20 Threads einfach schneller sind. Und selbst diese brauchen nicht übermäßig RAM, Prozessorleistung etc.

Um zu wissen, wann alle Threads fertig sind, einfach einen finished-Counter benutzen...

Edit: Für eine Progressbar mit Threads gibt's hier ne Anleitung: [Only registered and activated users can see links. Click Here To Register...]
E²: Evt. empfiehlt es sich, für die Threadsicherheit ein lock zu benutzen, macht aber praktisch keinen Unterschied.