[python] socket + udp + vytváření paketů
    Petr Messner 
    petr.messner na gmail.com
       
    Úterý Únor 21 19:52:40 CET 2012
    
    
  
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
    
    
Další informace o konferenci Python