Seite 1 von 1
filhandles und vieeele threads
Verfasst: Montag 25. September 2006, 15:37
von Costi
ich schreib grad einen programm, wo ca 300 threads ca jede 10 secunden ca 1 kb data in einer datei schreiben muessen^^
obwohl python mir keine fehlermeldungen gibt klappt es nicht.
wie muss ich die sache also angehen? (oder ist windoof dafür einfach zu "schwach")
Verfasst: Montag 25. September 2006, 16:41
von rayo
Hi
Sorry aber für was brauchst du bitte 300 Threads?
Reicht es nicht die 300 Dateien nacheinander zu schreiben?
In 10 Sekunden wird der PC sicher 300kb auf die Festplatte schreiben.
Gruss
Verfasst: Montag 25. September 2006, 17:11
von Costi
es wird ja alles in einer einzigen datei gescrieben,
vieleicht nochmal genaueres zum prob:
die data wird nur unvolsändig in der datei gescrieben. und ich hab das so gemacht, dass ich für jeden thread einen neuen filehandle aufgemacht wird
Verfasst: Montag 25. September 2006, 17:16
von Y0Gi
Das ist nicht gerade eine gute Idee. Kannst du nicht einen Thread machen, der das Filehandle offen hält und die Daten von den anderen Threads entgegennimmt?
Verfasst: Montag 25. September 2006, 17:37
von rayo
Und wieso brauchst du 300 Threads?
Kann nicht 1 Thread die Daten entgegen nehmen und in die Datei schreiben?
Beschreibe doch dein Problem mal genauer ... Was willst du erreichen und woher stammen die Daten.
Gruss
Verfasst: Montag 25. September 2006, 20:02
von Costi
ich denke, der quelltext sagt mehr als tausend worte...
(is ziemlich lange her das ichs geschrieben habe, kleinere bugs sind also nicht auszuschliesen)
Code: Alles auswählen
from time import sleep
import threading
import socket
from urlparse import urlparse
from random import randrange
def mkq():
a = "123a4e56i7a890poiuaieztraeewiaqasdfghjkilmanbevcxy"
ges = ""
for i in range(randrange(5)+3):
ges += a[randrange(len(a[:-1])+1)]
return ges
def rmTwice(resp):
resp = dict(zip(resp, resp)).keys()
return resp
def filter(resp):
index = 0
l1 = []
l2 = []
urls = []
while index is not -1:
index = resp.find('<a class=l', index + 1)
l1.append(index)
l2 = []
for i in range(len(l1)):
index = resp.find('">', l1[i])
l2.append(index)
for i in range(len(l1) - 1): # spaeter nachgicken wegen den -1.......
match = resp[l1[i]:l2[i]].replace('<a class=l href=', '').replace('"', '')
url = urlparse(match)[1]
urls.append(url)
return urls
def scan(resp):
ftps = ""
for host in resp:
try:
s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2.settimeout(1)
s2.connect((host, 21))
resp2 = s2.recv(128)
print host, ":\n", resp2
if resp2: ftps += host + ':\n' + resp2 + '\n--=000000=--\n'
except:
pass
#print "writing in file..."
f.write(ftps)
def google():
global f
f = open('ftpsLog.txt', 'a')
while 1:
jetzt = True
start = 0
B = "foobar"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('www.google.pl', 80))
keyword = mkq()
while 1:
#print "sending google req: GET /search?num=100&start=" + str(start) + "&q=" + keyword + " HTTP/1.1"
s.send("GET /search?num=100&start=" + str(start) + "&q=" + keyword + " HTTP/1.1\n")
s.send('Host: www.google.pl')
s.send('\n\n')
start += 100
resp = ""
while not '</html>' in resp:
resp += s.recv(1024)
resp = filter(resp)
if jetzt:
A = resp[:20]
else:
B = resp[:20]
jetzt = not jetzt
if not A == B:
resp = rmTwice(resp)
#print len(resp), "hosts wurden gefunden"
scan(resp)
else:
start = 0
break
for i in range(1000):
t = threading.Thread(target = google)
t.setDaemon(1)
t.start()
#t.join()
#print "thread wurde gesteratet"
sleep(0.1)
print 'ende mit mking threads'
try:
while 1:
sleep(100)
except:
f.close()
danke für die mühe

Verfasst: Montag 25. September 2006, 21:50
von rayo
Hi
Ist das richtig, dass du einfach 1000 Google-Anfragen mit zufälligen Suchbegriffen die URLs herauslesen willst und dann diese URLs öffnest und den Inhalt in eine Datei speicherst?
Hab ich es richtig verstanden?
Da gibts einige bessere Methoden sowas zu erledigen.
Ich würde jetzt z.B. so machen:
1 Thread, der die Google-Anfragen startet (mit der URL-Lib, nicht mit sockets) und dann die URLs via eine Queue an den 2. Thread schickt und dieser alle URLs öffnet und die Daten in eine Datei speichert.
Dann hast du gerade mal 2 Threads, die dauernd URL-Anfragen starten.
Gruss
Verfasst: Montag 25. September 2006, 22:03
von Y0Gi
Ich habe gute Erfahrungen mit Mark Pilgrims
PyGoogle gemacht. Damit kannst du aber nicht massenweise Anfragen stellen, sondern bist auf einige Tausend pro Tag beschränkt (mit dem kostenlosen Entwickler-Key).
Verfasst: Dienstag 26. September 2006, 11:41
von Costi
bezogen auf rayos antwort:
nicht ganz, es sind nicht 1000, sondern 1000 while 1 anfragen die geschickt werden ( ;. danach werden die urls nicht geöffnet (nehme an das du damit http get meinst), sondern der ftp banner wird gelogt. (wobei das erfolgreiche logen des ftp banners nicht mein endziel sondern nur ein zwischenschritt ist)
zwei threads waeren zu wenig und zwei thread gruppen (sozusagen get und scan) waere glaub ich ziemlich schwierig zu organizieren und zu unflexibel
ich krieg jetzt aber in den nächsten tagen endlich mein eigenes pc, wo ich naturlich was *NIXes draufpacke, und nehme an das es dan klappen müsste
edit{
Das ist nicht gerade eine gute Idee. Kannst du nicht einen Thread machen, der das Filehandle offen hält und die Daten von den anderen Threads entgegennimmt?
hey! natürlich, hatte dies voher irgendwie überlesen, aber so muüsste es eigentlich klappen
thx
}
Verfasst: Dienstag 26. September 2006, 13:14
von rayo
Hi
Was ist ein FTP-Banner? Die ersten 128 Byte des Headers einer Website?
Irgendwie seh ich es nicht ein warum du 1000 gleichzeitige Anfragen starten willst und nicht z.B. 10?
Gruss
Verfasst: Dienstag 26. September 2006, 13:29
von Y0Gi
rayo hat geschrieben:Was ist ein FTP-Banner?
Das ist der Begrüßungsstring eines FTP-Servers, der in der Regel den Namen und die Version der Serversoftware enthält.
Wieso genau der in diesem Zusammenhang relevant ist, verschließt sich mir bisher aber.
Verfasst: Dienstag 26. September 2006, 16:14
von rayo
Also sucht das Programm einfach FTP-Servers und die Software auf der er läuft?
Für was sollte das gut sein? Zum verwundbare Server finden?
Gruss
Verfasst: Dienstag 26. September 2006, 19:33
von Costi
mist, ich krieg das einfach nicht hin, ich weis nicht wie ich eine variable (die mit den zu schreibende hosts), zwischen allen threads sharen soll. Ich dachte immer ich müsste die variable erst deklarieren und dan in den thread als global setzen, funzt aber nicht. any ideas?
ür was sollte das gut sein? Zum verwundbare Server finden?
ursprünglich ja, hab diese fase aber schon hinter mir gelassen

Verfasst: Dienstag 26. September 2006, 19:48
von murph
eine idee wäre eine klasse mit self.variable...
eine andere, eine liste oder ein dictionairy zu benutzen...
Verfasst: Dienstag 26. September 2006, 20:42
von BlackJack
Die Kommunikation sollte am besten über `Queue.Queue` Objekte abwickeln, die sind threadsafe. Und diese kann man über die `__init__()` Methode an die Threads übergeben.