HTML

Friss topikok

  • Pretender: @Tiberius (the one): hallottam mondjuk már róla, de teljesen abban a tudatban voltam, hogy az mana... (2012.02.28. 18:43) Winapi Winforms
  • Pretender: @version: oké :) most végül lehet, h találtam valakit, majd látjuk ;) (2011.12.08. 19:26) Háló 2

2011.12.02. 07:44 Pretender

Háló

 És igen! Működik az UDP-s hálózat!

Az alap csomagkezelés nyilván nem bonyolult, de ha csak annyit csinálunk, hogy ontjuk ki magunkból az adatokat, az nem lesz túl jó, hiszen számolni kell:
- adatcsomag vesztéssel (packet lost, ha jól rémlik valami 1-5%)
- nem biztosított az adatok átviteli sorrendje
Tehát könnyen előfordulhat az, hogy küldünk egy chat üzenetet, és az mégsem érkezik meg (mert pont az elveszett), vagy 2 inputot, csak amit hamarabb küldtünk az később érkezik meg, ami elég érdekes eredményeket is adhat.

Erre készült el az a megoldás, hogy:
Minden egyes csomagot ellátok egy headerrel.
- Az első egy protocol id-nek nevezett dolog, ami a csomagok érkezésekor megnézi, hogy egyezik-e az általunk megadott id-vel. Így, hiába kapunk csomagokat máshonnan, ha a protocol id nem egyezik, akkor eldobjuk.
- A második adat egy azonosító (seqence id). Ha reliable (azaz biztosítani szeretnénk, hogy átmegy) a csomag, akkor az id-jét egy tömbből kiválasztom, ha nem reliable, akkor az id = 0.
- Elraktározom továbbá az időt, hogy mikor lett kiküldve. Az időt én tickenként számolom, 1 másodperc alatt 60 megy le. Egy unsigned longban tárolom el, aminek az értékkészlete [0;4294967295], ami után ha számolgatunk egy kicsit, akkor jó sok napig elég, hogy ne forduljon át :)
Ezt az időt használom a nem reliable (azaz 0 seq. id-jű) csomagok azonosítására. Ha az érkezett csomag headerjében lévő idő < mint amit utoljára kaptunk attól a címtől, akkor eldobjuk, hiszen régebbi csomagokkal nem akarunk foglalkozni. Ez az idő szerinti eldobás nem vonatkozik a reliable csomagokra.

A packet header nagyjából ennyi, nyilván mellérakom még továbbá a szükséges adatokat egy unsigned char tömbben, és kiküldöm. Ha a packet reliable, akkor elrakom egy listába, hiszen addig újra kell küldenünk az adott cím(ek)nek, amíg nem kapunk róla értesítést, hogy megkapta(k). Az értesítések küldése pedig úgy működik, hogy ha kapunk egy csomagot valakitől, és az reliable (a seq. id-ből ugye meg lehet állapítani), akkor létrehozok egy reply üzenetet, aminek a data mezőjébe beleírom az érkezett packet seq. id-jét. Ez alapján fogom tudni, hogy melyiket nem kell tovább küldeni.

Ha érkezik egy ilyen reply típusú üzenet, akkor a data mezőjében tárolt azonosító alapján kiválasztom az újraküldendő reliable üzenetek listájából a megfelelőt, majd törlöm belőle. Tehát reply-t is mindaddig küldünk, amíg reliable packetet kaptunk.

Röviden, tömören ennyi, javítgatni még sokat fogok rajta természetesen, és még csak helyi hálón lett letesztelve, de reményeim szerint ugyan úgy működni fog interneten keresztül is :)

Szólj hozzá!


A bejegyzés trackback címe:

https://screamengine.blog.hu/api/trackback/id/tr553430927

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása