[python] socket + udp + vytváření paketů

David Rohleder davro na ics.muni.cz
Středa Únor 22 08:48:54 CET 2012


David Rohleder píše v St 22. 02. 2012 v 00:30 +0100:
> Jakub Vojáček píše v Út 21. 02. 2012 v 23:56 +0100:
> > Dne 21.2.2012 23:34, David Rohleder napsal(a):
> > > azu je dle specifikace 01h, což do 1byte myslím nenarvu. 
> > > ^^^^ chybu máš tady. 01h do 1byte narveš. Když jsem to upravil na
> > > data = struct.pack("!IHHBB", 0, 0, 0, 1, 1)
> > > 
> > > tak mi ten baryk bez problémů odpověděl.
> > Děkuji. Podle specifikace modulu struct B odpovídá unsigned char.
> > Takže pokud budu chtít posílat serveru inicializační zprávu, tak pošlu
> > B, pokud mu později budu chtít poslat nějaká data, tak to musím narvat
> > do stringu (takže do s), chápu to správně?
> 
> Ne. Protože "1" je ASCII hodnota 49. Samozřejmě by to šlo, pokud bys
> dokázal do řetězce dát ta binární data. Tj. třeba jako data = data +
> chr(1)
> 
> Problém je spíš v tom struct, protože nepřijímá parametr typu pole,
> takže nejde napsat data = struct.pack("B"*10 , [ 1, 1, 1, 10...] )
> 
> V tomto případě bych použil modul array následovně:
> 
> import array
> 
> data = array('B' , [ seznam s hodnotami ] )
> 
> s.sendto(data.tostring(), (host,port))
>  


Když se na to teď trošku dívám, tak se to bude muset udělat spíš tak, že
se spojí ten struct s array asi následovně:

strukturovana_data = struct.pack(...)
nestrukturovana_data = array('B', list).tostring()
data_k_odeslani = strukturovana_data + nestrukturovana_data

s.sendto(data_k_odeslani,...)

To proto, abychom mohli použít ty funkce na převod do network byte
order, ikdyž k tomu se určitě dají použít i funkce typu hton().

David




Další informace o konferenci Python