<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body text="#000099" bgcolor="#ffffff">
    <font face="Calibri">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.<br>
      <br>
      Jakub<br>
    </font><br>
    Dne 21.2.2012 21:12, David Rohleder napsal(a):
    <blockquote cite="mid:1329855120.3239.0.camel@uruloki" type="cite">
      <pre wrap="">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:
</pre>
      <blockquote type="cite">
        <pre wrap="">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): 
</pre>
        <blockquote type="cite">
          <pre wrap="">Ahoj,

21. 2. 2012 v 19:19, Jakub Vojáček:
...
</pre>
          <blockquote type="cite">
            <pre wrap="">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. 
</pre>
          </blockquote>
          <pre wrap="">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?

</pre>
          <blockquote type="cite">
            <pre wrap="">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))

</pre>
          </blockquote>
          <pre wrap="">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ě :)

</pre>
          <blockquote type="cite">
            <pre wrap="">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ě.
</pre>
          </blockquote>
          <pre wrap="">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?

</pre>
          <blockquote type="cite">
            <pre wrap="">Prosím Vás tedy o nějaký nápad, jak dál postupovat a jestli je např. použití modulu struct vhodné.

</pre>
          </blockquote>
          <pre wrap="">Modul struct je vhodný přesně na toto.

PM

</pre>
          <blockquote type="cite">
            <pre wrap="">Děkuji za každou radu

Jakub
</pre>
          </blockquote>
          <pre wrap="">

_______________________________________________
Python mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Python@py.cz">Python@py.cz</a>
<a class="moz-txt-link-freetext" href="http://www.py.cz/mailman/listinfo/python">http://www.py.cz/mailman/listinfo/python</a>

</pre>
        </blockquote>
        <pre wrap="">_______________________________________________
Python mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Python@py.cz">Python@py.cz</a>
<a class="moz-txt-link-freetext" href="http://www.py.cz/mailman/listinfo/python">http://www.py.cz/mailman/listinfo/python</a>
</pre>
      </blockquote>
      <pre wrap="">

_______________________________________________
Python mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Python@py.cz">Python@py.cz</a>
<a class="moz-txt-link-freetext" href="http://www.py.cz/mailman/listinfo/python">http://www.py.cz/mailman/listinfo/python</a></pre>
    </blockquote>
  </body>
</html>