[Python] Socket e lettura dati

Manlio Perillo manlio.perillo a gmail.com
Sab 24 Mar 2012 14:41:36 CET


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Il 24/03/2012 13:21, Enrico 'Henryx' Bianchi ha scritto:
> On Friday, March 23, 2012 08:31:50 PM Manlio Perillo wrote:
>> Su IRC ricordo di averti consigliato di studiare le Netstrings, o simili.
> 
> Si, ricordo anche io di questa discussione (di cui, pero`, non trovo traccia 
> nei miei log, probabilmente l'abbiamo fatta quando ero a lavoro), il fatto e` 
> che bene o male ho gia` una netstring, ovvero so come comincia la stringa 
> ('["' o '[{"') e so come finisce ('}]\n'),

Se sei sicuro che \n non compaia all'interno della stringa, allora sei a
posto.

> mentre della sua lunghezza direi 
> che non me ne faccio molto.

La lunghezza ti serve per preallocare il buffer e sapere quanti bytes
leggere, se vuoi delle buone prestazioni.

> Il problema e` che in alcuni casi tale stringa non 
> mi arriva completa e mi crea grossi problemi, sia per il fatto che mi incarta 
> la lettura, sia per il fatto che si tratta di un dato perso e che devo 
> comunque recuperarlo, cosa che mi costringe a richiedere tutto il dataset 
> senza la garanzia di recuperare quello che mi manca. 

Daniele ti ha dato un suggerimento, vedi se dipende da quello.

> In teoria potrei 
> risolvere facendo il controllo della corretta lunghezza della stringa (if 
> (data[:2] == '["' or data[:3] == '[{"') and (data[-3:] == '}]\n')) ed inviare 
> al client un comando di notifica che, in caso negativo, reinvia il dato 
> (sinceramente mi sembra un po' brutto, ma non vedo alternative)
> 
> Enrico
> P.S. che poi, se leggo i dati via netcat non ho alcun problema, ovvero le 
> stringhe mi arrivano complete
> 

Utilizzando lo stesso "server" (processo che invia i dati)?
In questo caso secondo me il problema è che ti trovi un '\n' dentro una
stringa...

Prova a mettere qualche assert:

for item in res.get():
    assert "\n" not in item

    n = conn.send(item + "\n")
    assert n == len(item) + 1


Comunque usando i socket a basso livello ci sono molte cose a cui badare.



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

iEYEARECAAYFAk9tzxAACgkQscQJ24LbaUSQXwCcDHk4qt+eFXd9eZcBgJ62eydE
tLMAn1EVWlyVzbXLi9WfgBuQ/dMin+it
=vsWL
-----END PGP SIGNATURE-----


Maggiori informazioni sulla lista Python