Re: [Python] controllare risposta tcp/ip

2012-08-22 Per discussione Matteo Perini

Grazie a tutti delle risposte.
Provo a sondare un po le alternative e poi mi rifarò sentire sicuramente 
per dei consigli.

Ciao
Matteo
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] controllare risposta tcp/ip

2012-08-22 Per discussione Matteo Perini

Ciao,
rieccomi.
Sto risolvendo abbastanza bene con un codice tipo questo (semplifico un 
po' per brevità):


s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.1.100",5001))
s.send('comando')

r=""
i=0
while True:
resp = s.recv(1)
r=r+str(resp)
if r[-10:]=="\r\n":
break

Sembra funzionare!
Grazie ancora a tutti (disponibilissimi anche in questo agosto torrido)
PS: c'è un modo di fare il print dei caratteri di escape (tipo \r\n)?
Vorrei riuscire a fare una cosa del genere:
>>>print "ciao\n"
ciao\n

Ciao
Matteo
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] controllare risposta tcp/ip

2012-08-22 Per discussione Andrea Francia
2012/8/22 Matteo Perini 

> PS: c'è un modo di fare il print dei caratteri di escape (tipo \r\n)?
> Vorrei riuscire a fare una cosa del genere:
> >>>print "ciao\n"
> ciao\n
>

Credo:

  print repr("ciao\n")

In generale repr funziona su tutti gli oggetti (e altri tipi), non solo le
stringhe.
Sugli oggetti funziona solo se hai definito __repr__ (vedi la
documentazione per approfondimenti).
A me viene molto comoda per il debug e per i test di caratterizzazione
quando uso la libreria mock di voidspace.

Ciao
-- 
Andrea Francia http://andreafrancia.it
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] controllare risposta tcp/ip

2012-08-22 Per discussione Marco De Paoli
Il giorno 22 agosto 2012 15:07, Matteo Perini  ha
scritto:

> resp = s.recv(1)
>

perché non metti un valore più alto di 1?
probabilmente nel tuo caso (in cui mi pare che scambi piccoli comandi di
testo) la cosa è ininfluente
però attenzione, perché un buffer così piccolo può risultare di una
lentezza esasperante

Marco
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] controllare risposta tcp/ip

2012-08-22 Per discussione Matteo Perini



Credo:

  print repr("ciao\n")

In generale repr funziona su tutti gli oggetti (e altri tipi), non 
solo le stringhe.
Sugli oggetti funziona solo se hai definito __repr__ (vedi la 
documentazione per approfondimenti).
A me viene molto comoda per il debug e per i test di caratterizzazione 
quando uso la libreria mock di voidspace.



Grazie perfetto!
Ciao
Matteo
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] controllare risposta tcp/ip

2012-08-22 Per discussione Andrea Francia
2012/8/22 Matteo Perini 

> s = socket.socket(socket.AF_INET,**socket.SOCK_STREAM)
> s.connect(("192.168.1.100",**5001))
> s.send('comando')
>
> r=""
> i=0
> while True:
> resp = s.recv(1)
> r=r+str(resp)
> if r[-10:]=="\r\n":
> break
>

Non mi convince molto il fatto che smetti di ricevere quando ricevi
"\r\n"
Se non dico stupidate (e potrei) stai usando una informazione a livello di
applicazione (application layer) per controllare una cosa che é a livello
di trasporto. La cosa mi puzza. Cosa succede quando il client ti manda solo
fino a "", senza "\r"?

Mi piacerebbe consigliarti il modo giusto ma sulla documentazione non l'ho
visto. Se funzionasse come dico io dovrebbe andare bene usare questo if al
posto del tuo (ma é una mia supposizione):

   if resp = '':
   break

Ciao
-- 
Andrea Francia http://andreafrancia.it
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] controllare risposta tcp/ip

2012-08-22 Per discussione Matteo Perini

Il 22/08/2012 15:19, Marco De Paoli ha scritto:



Il giorno 22 agosto 2012 15:07, Matteo Perini > ha scritto:


resp = s.recv(1)


perché non metti un valore più alto di 1?
probabilmente nel tuo caso (in cui mi pare che scambi piccoli comandi 
di testo) la cosa è ininfluente
però attenzione, perché un buffer così piccolo può risultare di una 
lentezza esasperante


Marco


Si ci avevo pensato.
Però preferisco la lentezza rispetto all'errore.
In realtà devo trasferire un file xml (sempre lo stesso al cui interno 
cambiano i valori delle variabili) da un dispositivo esterno, al pc.



I caratteri sono circa 1000.

ma anche se uso
resp = s.recv(2)

(adesso so che i 2 sono byte)

molte volte resp appare troncato in modo random
e quindi non riesco a farne il parsing per leggere le variabili.

Ho provato a fare il print con print repr(resp)
ma il buffer non contiene caratteri non voluti.

Lo scambio di dati avviene in base all'attività dell'utente ma in media 
2/3 volte al minuto quindi i tempi per me non sono un problema.
Comunque ho fatto due test e il tempo impiegato è circa 1,15 centesimi 
di secondo per 2500 caratteri.


Mi piacerebbe però molto capire come mai la resp viene troncata in modo 
selvaggio e apparentemente senza nessuna spiegazione.


Ciao e grazie
Matteo



___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] controllare risposta tcp/ip

2012-08-22 Per discussione Matteo Perini



if r[-10:]=="\r\n":
break


Non mi convince molto il fatto che smetti di ricevere quando ricevi 
"\r\n"
Se non dico stupidate (e potrei) stai usando una informazione a 
livello di applicazione (application layer) per controllare una cosa 
che é a livello di trasporto. La cosa mi puzza. Cosa succede quando il 
client ti manda solo fino a "", senza "\r"?


Mi piacerebbe consigliarti il modo giusto ma sulla documentazione non 
l'ho visto. Se funzionasse come dico io dovrebbe andare bene usare 
questo if al posto del tuo (ma é una mia supposizione):


   if resp = '':
   break

Si anch'io non ho trovato molto sulla documentazione.
La tua soluzione mi piace molto... e i tempi calano molto (meno di 2 
millesimi di secondo).

Avevo visto qualcosa del genere in un esempio trovato on-line.
Devo fare delle prove un po' più rigorose per essere sicuro di poterlo 
usare con sicurezza.

Grazie mille
Ciao
Matteo

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] controllare risposta tcp/ip

2012-08-22 Per discussione Marco De Paoli
Il giorno 22 agosto 2012 15:58, Matteo Perini  ha
scritto:

>  Mi piacerebbe però molto capire come mai la resp viene troncata in modo
> selvaggio e apparentemente senza nessuna spiegazione.
>

secondo me è corretto che tu faccia il ciclo di lettura
perché i livelli di rete sottostanti potrebbero inviarti dati parziali
troncando dove gli pare e piace

però sono daccordo con quello che ti consiglia Andrea, non potresti testare
la resp vuota contando sul fatto che il client chiude la comunicazione?

al momento non ho tempo di fare alcuna prova per cui prendi tutto con
beneficio di inventario in base a ricordi remoti

Marco

P.S. piccolo commento finale: sei sicuro di non poter usare qualcosa di più
alto livello (es. HTTP)? io non ho gran bei ricordi di uso diretto delle
socket: si ha l'impressione di partire con una cosa semplice semplice in
cui si ha il controllo completo, però poi saltano fuori un sacco di
particolari che incasinano le cose oltre le previsioni iniziali ...
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] controllare risposta tcp/ip

2012-08-22 Per discussione Manlio Perillo
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

Il 22/08/2012 15:07, Matteo Perini ha scritto:
> Ciao,
> rieccomi.
> Sto risolvendo abbastanza bene con un codice tipo questo (semplifico un
> po' per brevità):
> 
> s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
> s.connect(("192.168.1.100",5001))
> s.send('comando')
> 
> r=""
> i=0
> while True:
> resp = s.recv(1)
> r=r+str(resp)
> if r[-10:]=="\r\n":
> break
> 

i a cosa dovrebbe servire?

> Sembra funzionare!

Si, ma non è la soluzione migliore.

Ti ho detto come fare; ecco un esempio (non testato):

## Client
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.1.100", 5001))
buf = '...'
s.send(buf)
s.close() # termina connessione, recv restituirà un buffer vuoto


## Server
buf = [] # accumula i dati in una lista
buf_size = 8196
data = s.recv(buf_size)
while data:
buf.append(data)
data = s.recv(buf_size)

data = ''.join(buf) # più efficiente della tua soluzione
# parsing dei dati, oppure puoi usare un feed parser


Ciao  Manlio
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAlA1PGwACgkQscQJ24LbaUQTngCfSGCBCyjYeARZeillYurm5/7D
qY0An05PAZkkmN0YC1yFW78R7lqZ0Nvl
=vdUm
-END PGP SIGNATURE-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python