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

David Rohleder davro na ics.muni.cz
Úterý Únor 21 21:19:20 CET 2012


btw. nevím, jak moc je ten kód úplný, ale chybí tam 
s.bind(("",0))


Jakub Vojáček píše v Út 21. 02. 2012 v 20:55 +0100:
> Dobrý den,
> 
> v zadání je uvedeno, že indikátor spojení a sekvenční číslo je v
> reprezentaci network byte order (big endian) - znamená to tedy, že ten
> zbytek mám reprezentovat v little endian?
> 
> data jsem zkoušel balit s paddingem i bez paddingu, ani jednou server
> neodpověděl, takže to asi nehraje roli (i když jako korektní řešení se
> mi zdá použít tu verz bez paddingu). Pomocí wiresharku jsem
> vysniffoval ten packet a má obsah
> 
> f8 d1 11 a2 4f 2c 48 5d  60 85 3e d8 08 00 45 00  
> 00 26 0c 13 00 00 80 11  f1 d4 c0 a8 00 69 93 20   
> e8 ad e7 a7 0f a0 00 12  ca 71 00 00 00 00 00 00   
> 00 00 01 31   
> 
> Ale ty data jsou nějak zakódována a popravdě se v nich moc nevyznám.
> Referenční řešení, které by fungovalo a jehož pakety bych mohl
> vysniffovat bohužel nemám. 
> 
> Přístup k serveru mám, ale pouze vzdálený (beží na
> 147.32.232.173:4000), ale protože tahle úloha je udělána tak, aby se
> programovala v C nebo v Jave, tak žádné testovací rozhraní, které by
> mi řeklo, co je špatně neexistuje (Python jsem si mohl zvolit, ovšem
> bylo mi řečeno, že musím počítat s "nulovou" podporou ze strany školy.
> Mám tedy pouze k dispozici refernční výstup programu, kde se klient
> připojuje k serveru:
> 
> 232 00000000 SEND 127.0.0.1:4000 seq=0 ack=0 flags=01 data(1): 01
> = zpráva zaslaná klientem
> 311 8CB60002 RECV 127.0.0.1:4000 seq=768 ack=0 flags=00 data(256): d0
> 93 9a 0e 35 da 0b 9e … 08 0a e0 08 4c 33 37 c9   =   odpověd zaslaná
> serverem (tu právě nedostávám)
> 
> Bohužel celé to zadání je trochu zmatené. Je řečeno, že příznak má být
> první zprávy nastaven na SYN a je tam tabulka:
>  číslo
>  bitu
>    7
>    6
>    5
>    4
>    3
>    2
>    1
>    0
> příznak
>    -
>    -
>    -
>    -
>    -
>   RST
>   FIN
>   SYN
> A nyní mi tedy není  úplně jasné, jestli příznaku syn odpovída číslo
> 000000001 = 1
> 
> Vypadá to, že asi nakonec budu nucen použít některý z podporovaných
> jazyků.
> 
> Děkuji za Vaše názory
> 
> Jakub
> 
> 
> Dne 21.2.2012 19:52, Petr Messner napsal(a): 
> > Ahoj,
> > 
> > 21. 2. 2012 v 19:19, Jakub Vojáček:
> > ...
> > > Pokud bych neměl definován tvar paketu, tak bych použil 
> > > 
> > > s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM )
> > > s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
> > > s.sendto(data, host, port))
> > > 
> > > , ale jelikož je přesně definována velikost a struktura paketu, tak tento způsob nemohu použít. 
> > Nerozumím tomu, proč tento způsob nemůžeš použít. Jediné, co potřebuješ upravit, jsou data. Jak ten paket chceš potom odeslat, když ne takto?
> > 
> > > Formát je definován následovně:
> > > - 4B jsou rezervovány na identifikátor spojení
> > > - 2B jsou rezervovány na sekvenční číslo
> > > - 2B jsou rezervovány na číslo potvrzení
> > > - 1B je rezervován na příznak
> > > - 0-256B je rezervováno na data
> > > 
> > > Abych řekl pravdu, vůbec jsem nevěděl, jak začít. Nakonec jsem se pokusil použít modul struct a přenáše data zabalena pomoci toho modulu.
> > > 
> > > Použil jsem tedy funkci struct.pack()
> > > 
> > > data = struct.pack("!IHHB256s", 0, 0, 0, 1, "1")
> > > s.sendto(data, (host, port))
> > > 
> > Možná je chyba zde. Jako data posíláš "1", ale zabališ to jako "1" a za tím 255 znaků 0x00. To možná takto být nemá, záleží na zadání.
> > 
> > Také pozor na endianitu. Vykřičníkem nastavuješ network/big-endian byte order, což by mělo být správně, ale je možné, že server je naprogramovaný špatně :)
> > 
> > > Jenomže tento způsob také nefunguje, protože pokud pošlu takto zabalenou zprávu referenčnímu serveru, tak nedostanu odpověď - tudíž server nepřečetl paket správně.
> > Zkus se třeba tcpdumpem nebo wiresharkem (zmiňovaném v dalším mailu) podívat, co přesně lítá po síti. Není možné nějak z toho serveru zjistit, co je špatně? Máš ten server nějak k dispozici?
> > 
> > > Prosím Vás tedy o nějaký nápad, jak dál postupovat a jestli je např. použití modulu struct vhodné.
> > > 
> > Modul struct je vhodný přesně na toto.
> > 
> > PM
> > 
> > > Děkuji za každou radu
> > > 
> > > Jakub
> > 
> > 
> > _______________________________________________
> > Python mailing list
> > Python na py.cz
> > http://www.py.cz/mailman/listinfo/python
> > 
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python




Další informace o konferenci Python