Visszaraktam az UDP hálózatot közben, azonban voltak vele gondok (például 3-4 kliensnél hébe-hóba elszállt, meg ilyesmi - a free.c, heap memóriára hivatkozva), azokat orvosoltam.
Eddig úgy volt, hogy minden egyes packet érkezésekor és küldésekor nyomok egy new Packet(...)-et, ami ráadásul létrehoz egy új tömböt (data = new unsigned char[...]), majd ha fel lett dolgozva, akkor delete (és delete [] data). Valószínűleg ezért szállt el a progi :)
Először placement new-os megoldást nézegettem, azután sétálgatva az utcán majd' a fejemhez csaptam, hogy a legegyszerűbb miért nem jutott eszembe:
Mindegyik címhez tartozik 3 lista (vector), amikben Packet*-eket tárolok. Amikor hozzáadunk egy célállomást (azaz szerver esetében az x. kliens, kliens esetében csak 1x: a szerver), akkor ezekből lefoglalok előre memóriát: mindegyik vectort átméretezem (*.resize(INITIAL_SIZE), ahol az INITIAL_SIZE most 50), illetve mindegyik packetet maximális méretűre hozom létre (ami 250 + 7 byte). Ezzel számolgatva kicsit, egy kliens 257*3*50 = 38550 byte, ami ~ 37,6kb. Ami azért nem túl sok :)
Innentől se push_back, se erase, csak a counterek növelése, nullázása, és a megfelelő értékek állítása. És működik. Most már tényleg! :)
Egyetlen hátránya van még: kicsit sok a keresgélés. Amikor jön egy packet, akkor a cím alapján meg kell keresnem az adott "célállomást". Amikor reliable packet érkezik, akkor meg kell keresnem, hogy volt-e már fogadva. Ehhez kapcsolódóan amikor választ akarok generálni, meg kell néznem, hogy már generálva lett-e. Pár ilyen van még, ez most a leggyengébb része, amúgy egész jól megy (nyilván csak ilyen 10 kliensig tudtam kipróbálni, ráadásul még csak local network)
Apropó, válasz: amikor ugye reliable packet érkezik, akkor kell rá egy nyugtázó üzenet, hogy "oké tesó, megkaptam, ne küldjed többet!". Ezeket egyelőre külön packetekben küldöm el, viszont meg lehetne csinálni egy olyasfajta "bitfield"-el, hogy a packetek headerjéhez még hozzácsapom, így ha már 1db packet átmegy, akkor abban benne lennének azok, hogy melyik reliable packeteket kapta meg, így kevesebbszer küldené el "fölöslegesen" ugyan azt -> kevésbé terhelné a hálót. No de ez később. :)
Ajánlott bejegyzések:
A bejegyzés trackback címe:
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.