PDA

View Full Version : [bash/Python ?] script telnet


Tyreal
03-02-2012, 14:51
Salve a tutti,
prepongo che ciò che devo chiedere non ha nulla a che spartire con un Dos et simila :)

ho realizzato un server in C++ con epoll (http://en.wikipedia.org/wiki/Epoll) per testarlo al confronto della "vecchia" select.

il mio problema deriva dal fatto che dovrei testarlo con circa 1000 utenti, ma è una follia aprire 1000 terminali così ho cominciato a cercare soluzioni basate sulla programmazione.

Ho provato con uno script bash e con python (dei quali sono molto, molto ignorante :) )

#!/bin/bash
for i in $(seq 1 1000); do nc localhost 2020; done


e

import getpass
import sys
import telnetlib
import time

HOST = "localhost"
i=0

while i<1000:
i=i+1
print i
tn = telnetlib.Telnet(HOST, 2020)
time.sleep(1)


il problema di entrambi è che eseguono una connessione e subito dopo la sua disconnessione (o al più un paio di connessioni prima di disconnettersi per la priorità dei flag di epoll) non lasciandomi provare la "reattività" del server con i 1000 utenti connessi contemporaneamente.
come posso fare? non avendo mai fatto una cosa del genere non so bene da dove iniziare, non dovrò mica threaddare ogni chiamata?! :mbe:

Grazie!

saluti
Riccardo

starfred
03-02-2012, 20:09
ciao, ci sono diverse soluzioni, la prima, quella con il bash, è che quando esegui il telnet lo mandi in background. La seconda è farlo in c++.

Io opterei decisamente per la seconda.

cdimauro
04-02-2012, 08:13
import getpass
import sys
import telnetlib
import time

HOST = "localhost"
i=0

while i<1000:
i=i+1
print i
tn = telnetlib.Telnet(HOST, 2020)
time.sleep(1)

il problema di entrambi è che eseguono una connessione e subito dopo la sua disconnessione (o al più un paio di connessioni prima di disconnettersi per la priorità dei flag di epoll) non lasciandomi provare la "reattività" del server con i 1000 utenti connessi contemporaneamente.
come posso fare? non avendo mai fatto una cosa del genere non so bene da dove iniziare, non dovrò mica threaddare ogni chiamata?! :mbe:

Grazie!

saluti
Riccardo
Mi pare normale che lo script non ti funzioni come vorresti, perché ogni volta apri una connessione, ma questa rimane in vita finché non ne apri un'altra (ecco perché a volte ne vedi 2) che sovrascrive la precedente (perché la variabile che usi per memorizzarle è sempre la stessa).

Prova così:
import getpass
import sys
import telnetlib
import time

HOST = "localhost"
Connections = []
for i in xrange(1, 1001):
print i
Connections.append(telnetlib.Telnet(HOST, 2020))
time.sleep(1)
In questo modo ogni connessione che crei viene inserita in una lista.

Soltanto quando esci dal ciclo e il programma termina verranno poi chiuse tutte le connessioni aperte, quando la lista verrà distrutta.
ciao, ci sono diverse soluzioni, la prima, quella con il bash, è che quando esegui il telnet lo mandi in background. La seconda è farlo in c++.

Io opterei decisamente per la seconda.
Don't underestimate the power of Python. :cool:

Tyreal
04-02-2012, 14:36
my god !! :D

funziona ! ( dovrò approfondire il python, ora come ora mi sento molto in crisi anche solo ad andare a capo senza mettere un terminatore, per non parlare della dichiarazione delle variabili :D )

comunque proprio ingenuo! non mi ero nemmeno soffermato sul fatto di riscrivere la stessa variabile, sono stato un pò fregato dal fatto che ne apre fino a 10 contemporaneamente ma solo perchè epoll non l'ha ancora processata come disconnessa (anche se in realtà non esisteva più) :)

grazie mille! ora ho un fantastico segmentation fault alla 893esima connessione :(

ma questa è un'altra storia :cool:

marco.r
04-02-2012, 15:05
Ho provato con uno script bash e con python (dei quali sono molto, molto ignorante :) )

#!/bin/bash
for i in $(seq 1 1000); do
nc localhost 2020&
done


Devi farli partire in parallelo (aggiungi la & alla fine del comando per farlo partire in background)