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

David Rohleder davro na ics.muni.cz
Středa Únor 22 00:30:38 CET 2012


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))
 

> 
> A nyní se asi objevil problém, o kterém mluvil pan Vejražka:
> > Ale ja jsem u toho b) nepsal o tom, ze by bylo neco spatne s tvym formatem UDP paketu nebo jeho obsahem. Troufnul bych se tvrdit, ze mas obycejny sitovy problem - tvuj domaci router blokuje "nezname" prichozi UDP pakety.
> Protože pokud kód opravím, tak, jak mi bylo doporučeno, tak stále
> nedostávam od serveru žádnou odezvu. Dalo by se nějak nastavit v
> nastavení routeru, aby pouštel UDP pakety? nějaký forwarding nebo něco
> takového.

Ten problém může být:

a) ve firewallu na routeru
b) v neschopnosti routeru vytvořit connection tracking tabulku, aby
věděl, kam poslat odpověď od serveru (méně pravděpodobné)
> 
Nejjednodušší to bude patrně pustit na nějakém školním počítači, protože
tam nebude NAT ani firewall.

D.





Další informace o konferenci Python