[Python] controllare risposta tcp/ip

Alberto Granzotto agranzot a gmail.com
Mar 21 Ago 2012 13:52:07 CEST


2012/8/21 Matteo Perini <perini.matteo a gmail.com>

> 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:
> <server>
>   <var1>TRUE</var1>
>   <var2>TRUE</var2>
>   <var3>FALSE</var3>
>   <var4>TRUE</var4>
>   <var5>FALSE</var5>
>   <var6>55.5</var6>
> </server>
>
> 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 a lists.python.it
> http://lists.python.it/**mailman/listinfo/python<http://lists.python.it/mailman/listinfo/python>
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20120821/a01c0a00/attachment.html>


Maggiori informazioni sulla lista Python