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

Jakub Vojáček jakohv na seznam.cz
Úterý Únor 21 21:17:01 CET 2012


Určitě je to UDP, ty SYN apod. tam jsou jenom pro zvětšení obtížosti. Je 
to jenom int, který nabývá různé hodnoty.

Jakub

Dne 21.2.2012 21:12, David Rohleder napsal(a):
> Tak já nevím, ale opravdu to má být UDP? Protože všechno nasvědčuje spíš
> tomu, že je to TCP. V UDP žádné SYN, ACK a pod. nejsou.
>
> David
>
> 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
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20120221/7a17e909/attachment.html>


Další informace o konferenci Python