[Python] controllare risposta tcp/ip

2012-08-21 Per discussione Matteo Perini

Ciao a tutti,
sapete dirmi come fare a controllare la risposta ottenuta durante una 
comunicazione client-server?


Cerco di spiegare meglio il mio problema.
ho del codice simile a questo:

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.1.102",5001))
s.send('comando')
resp = s.recv(1024)


dove 1024 dovrebbe essere il numero di caratteri "letti". giusto?

Quando invio il comando dovrei ottenere una risposta dal server e 
solitamente è così.
Il problema è che la risposta resp che ottengo, in qualche caso, appare 
troncata.


La risposta deve essere una struttura xml tipo questa:

  TRUE
  TRUE
  FALSE
  TRUE
  FALSE
  55.5


Se la struttura non arriva completa non posso fare il parsing dell'xml.

Come posso controllare che la struttura arrivi completa?
Devo controllare le righe iniziale e finale?
Devo svuotare in qualche modo il buffer prima di leggere (non dovrebbe 
essere pieno!)?

Leggo troppi caratteri?

E' un problema che si verifica solo ogni tanto e non riesco a trovarne 
una causa.

Il server è windows il client monta linux.

Grazie a chiunque mi indichi qualche possibile strategia per evitare 
questo fastidioso problema.

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


Re: [Python] controllare risposta tcp/ip

2012-08-21 Per discussione Alberto Granzotto
2012/8/21 Matteo Perini 

> Ciao a tutti,
> sapete dirmi come fare a controllare la risposta ottenuta durante una
> comunicazione client-server?
>

ciao Matteo


> Cerco di spiegare meglio il mio problema.
> ho del codice simile a questo:
>
> s = socket.socket(socket.AF_INET,**socket.SOCK_STREAM)
> s.connect(("192.168.1.102",**5001))
> s.send('comando')
> resp = s.recv(1024)
>
>
> dove 1024 dovrebbe essere il numero di caratteri "letti". giusto?
>

non sono espertissimo di socket, ma 1024 è il numero massimo di byte da
leggere e il tutto può essere anche molto frammentato.


> Quando invio il comando dovrei ottenere una risposta dal server e
> solitamente è così.
> Il problema è che la risposta resp che ottengo, in qualche caso, appare
> troncata.
>
> La risposta deve essere una struttura xml tipo questa:
> 
>   TRUE
>   TRUE
>   FALSE
>   TRUE
>   FALSE
>   55.5
> 
>
> Se la struttura non arriva completa non posso fare il parsing dell'xml.
>
> Come posso controllare che la struttura arrivi completa?
> Devo controllare le righe iniziale e finale?
> Devo svuotare in qualche modo il buffer prima di leggere (non dovrebbe
> essere pieno!)?
> Leggo troppi caratteri?
>

La mia personale opinione è che qui c'è un problema di astrazioni. A pelle
(ma non c'è alcuna dimostrazione matematica o che su questo) ti dico che mi
fa strano vedere che gestisci una comunicazione a bassissimo livello
(socket) per avere dell'XML. La gestione dei socket è semplice ma la
*comunicazione* rischia di essere complessa: devi crearti tu un protocollo
di comunicazione per decidere quando un messaggio è finito o no.

O fai un ciclo con dentro la recv, butti tutti i byte in un buffer e
termini quando trovi la fine del tag di riferimento, o utilizzi qualche
cosa più ad alto livello, magari mediato da un protocollo di comunicazione
tipo HTTP o XMLRPC (odio xmlrpc ma usato da python è bellissimo <
http://docs.python.org/library/xmlrpclib.html>), ovviamente c'è l'overhead
del protocollo ma qualcosa devi pagare :)

Dai una occhiata anche alle netstring che magari aiutano <
http://en.wikipedia.org/wiki/Netstring>

E comunque dipende sempre tutto da quello che devi fare, nel tuo caso forse
c'è bisogno di una comunicazione più da "chat" ovvero botta e risposta
(visto come usi i comandi), se vuoi stare comunque basso livello c'è il
bellissimissimo modulo `asynchat` che ti può venire in aiuto: definisci i
terminatori delle stringhe di comunicazione e asynchat fa il resto.

Ammetto che come risposta non è molto strutturata ma il caldo non aiuta :P

ciao,
Alberto


> E' un problema che si verifica solo ogni tanto e non riesco a trovarne una
> causa.
> Il server è windows il client monta linux.
>
> Grazie a chiunque mi indichi qualche possibile strategia per evitare
> questo fastidioso problema.
> Ciao
> Buon caldo
> Matteo
> __**_
> Python mailing list
> Python@lists.python.it
> http://lists.python.it/**mailman/listinfo/python
>
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] controllare risposta tcp/ip

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

Il 21/08/2012 12:47, Matteo Perini ha scritto:
> Ciao a tutti,
> sapete dirmi come fare a controllare la risposta ottenuta durante una
> comunicazione client-server?
> 

Lo devi decidere tu, definendo un protocollo sopra TCP/IP.

> Cerco di spiegare meglio il mio problema.
> ho del codice simile a questo:
> 
> s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
> s.connect(("192.168.1.102",5001))
> s.send('comando')
> resp = s.recv(1024)
> 
> 
> dove 1024 dovrebbe essere il numero di caratteri "letti". giusto?
> 

Il numero massimo di bytes (non caratteri, che sono un altra cosa) da
leggere.
Vedi anche:
http://pubs.opengroup.org/onlinepubs/7908799/xns/recv.html


> Quando invio il comando dovrei ottenere una risposta dal server e
> solitamente è così.
> Il problema è che la risposta resp che ottengo, in qualche caso, appare
> troncata.
> 

Si, perchè non sai quanto è lunga e quindi o leggi troppo poco (e la
risposta è ovviamente troncata) oppure leggi troppo (e recv bloccherà
indefinitivamente, a meno che l'altro lato della connessione non chiuda
la connessione).

> [...] 
> Come posso controllare che la struttura arrivi completa?

Definisci un protocollo, ad esempio netstring
http://en.wikipedia.org/wiki/Netstring
oppure, semplicemente, fai in modo da utilizzare una sola connessione
per ogni richiesta/risposta.

In questo caso il programma che invia il file XML deve chiudere la
connessione dopo aver inviato tutti i dati; lato server termina di
leggere quando recv restituisce una stringa vuota.

Di volta in volta leggi 8196 bytes, che è la lunghezza consigliata per
il buffer.

> [...]


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

iEYEARECAAYFAlAznzkACgkQscQJ24LbaUSMRgCeOI05mOP2WRqrSvgU5e5Tskkm
eOsAnjHnXy7ptuCQo+MNfedodotlj/is
=Kyp9
-END PGP SIGNATURE-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


[Python] controllare risposta tcp/ip

2012-08-21 Per discussione Remo The Last


Per esperienza ti consiglio di usare scapy che è un mostro per la gestione 
client/server per i protocolli + diversi.
Gestisci la risposta creando addirittura delle tabelle o semplicemente i campi 
come più ti aggrada. 

E' tutto implementato in Python e lo importi come un modulo qualunque.
Consigliato per la gestione di comunicazioni tcp/ip.

Ciiao
py.Re


- Messaggio inoltrato -
Da: Matteo Perini 
A: Discussioni generali sul linguaggio Python  
Inviato: Martedì 21 Agosto 2012 12:47
Oggetto: [Python] controllare risposta tcp/ip
 
Ciao a tutti,
sapete dirmi come fare a controllare la risposta ottenuta durante una 
comunicazione client-server?

Cerco di spiegare meglio il mio problema.
ho del codice simile a questo:

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.1.102",5001))
s.send('comando')
resp = s.recv(1024)


dove 1024 dovrebbe essere il numero di caratteri "letti". giusto?

Quando invio il comando dovrei ottenere una risposta dal server e solitamente è 
così.
Il problema è che la risposta resp che ottengo, in qualche caso, appare 
troncata.

La risposta deve essere una struttura xml tipo questa:

  TRUE
  TRUE
  FALSE
  TRUE
  FALSE
  55.5


Se la struttura non arriva completa non posso fare il parsing dell'xml.

Come posso controllare che la struttura arrivi completa?
Devo controllare le righe iniziale e finale?
Devo svuotare in qualche modo il buffer prima di leggere (non dovrebbe essere 
pieno!)?
Leggo troppi caratteri?

E' un problema che si verifica solo ogni tanto e non riesco a trovarne una 
causa.
Il server è windows il client monta linux.

Grazie a chiunque mi indichi qualche possibile strategia per evitare questo 
fastidioso problema.
Ciao
Buon caldo
Matteo
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python