UDP programozás

Legutóbb ott hagytuk abba, hogy kipakoltuk a komponenseket a Formunkra. Most a protokollokról illetve más érdekeségekről lesz szó.

Tisztázzunk még egy fontos alapfogalmat, melyre a múltkor utaltam: a protokoll fogalmát.

A protokoll nem más, a hálózaton történő adatküldést meghatározó szabályok és előírások gyűjteménye. Ezek a szabályok határozzák meg a hálózati eszközök által küldött üzenetek tartalmát, formátumát, időzítését, sorrendjét és hibakezelését.

Félig-meddig saját protokollt ígértem: ez azt jelenti, hogy az UDP-t használjuk, de a küldött adatok formája, tartalma a saját szabályaink alapján fog felépülni, mégpedig a következőképpen: alapvetően 3 részre osztjuk az egész küldendő (kapott) üzenetet, egy felhasználói névre (pl.: AnTi), egy parancsra (pl.: msg), és egy üzenetre (pl.: Hello!). Ehhez bizonyos szeparátorokat (elválasztó jeleket) kell alkalmaznunk. Nálam ez a jel (de lehet jelsorozat is) a #-karakter. Egy üzenetem így néz ki: #0AnTi#msg#Hello!. Mindig #0 az üzenet eleje. Hogy miért? Mert így találtam ki.

Ezt természetesen csak egy saját kitaláció, ettől jobbat és szebbet is alkothatunk, csak rajtatok múlik, viszont javaslom, hogy valami hasonlót találjanak ki, mert ezzel mindent meg lehet csinálni. Nagy hangsúly van a „parancs”-on. Az utolsó részben erre még kitérünk.

Összegezve: ki kell találnunk egy üzenetközlési formát, amilyen formára hozzuk, illetve amilyen forma alapján szétbontjuk a küldendő/kapott adatokat. A név küldése (AnTi) azért jó, mert sokkal barátságosabb, ha egy nevet látunk, nem egy IP címet. Ha ez megvan, akkor csak a saját parancsokat kell kitalálni, illetve ezekre a program reakcióját és kipipálhatjuk a protokollt is.

Programunk nagy vonalakban:

Miután kitaláltuk a protokollt, elkezdhetünk gondolkodni, mi is szükséges ahhoz, hogy működőképes programot kapjunk? Kell egy üzenetküldő, illetve fogadó eljárás. Meg is vagyunk. Az üzenetküldőt rendeljük hozzá az egyik gombunk OnClick metódusához, a másikat pedig a Socket OnDataReceived-jéhez.

Kezdjük mindjárt a közepével, írjuk meg az adatok küldéséről szóló eljárást! Erre azért van szükség, mert több dolgot is végre kell hajtanunk egy üzenet küldésekor. Az eljárás a következő paramétereket kapja: Címzett IP címe, a RemotePort, és az üzenet (mind legyen string).

Az eljáráson belül az első dolgunk az legyen, hogy beállítjuk a címzett paramétereit: IP cím, és a RemotePort. Ezután, ha szükséges alakítsuk át a paraméterként kapott üzenetet (ami az EditBoxba írtunk be) a magunk kitalált protokoll formájára. Nagyon fontos, hogy az NMUDP SendBuffer eljárását fogjuk használni. Ehhez szükségünk van egy 255 elemű karakter tömbre (array[1..255] of char), és egy ciklusváltozóra. Ezután egy egyszerű For ciklussal végigszaladunk a paraméterként kapott, protokollunkra átalakított stringünkön, és megtöltjük vele a karaktertömböt. Ez lesz a SendBuffer eljárás első paramétere. Második paraméterként a ciklusváltozót adjuk, mert oda az üzenet hossza kell. Nincs más dolgunk, minthogy egy gomb OnClick metódusához hozzárendelni, és gombnyomásra megy az EditBoxba írt üzenet! Ugye milyen egyszerű?

Az üzenetfogadás (OnDataReceived) alapvetően nem sokban különbözik, csupán annyiban, hogy nem összerakni kell az üzenetet „protokoll” formába, hanem szétszedni (a szeparátorok segítségével az egyszerű gondoljunk pl. a Pos-ra, de lehet ciklussal is), és a parancs alapján cselekedni. A kapott adat feladójának IP címét a Socket FromIP paramétere adja meg. Már tudjuk azt is, ki küldte az üzenetet, és azt is, hogy mit cselekedjünk (kiírjuk, küldjünk vissza valamit, vagy hajtsunk végre egy külső programot…stb.). Tulajdonképpen kész egy alapvető üzenetküldő program (igazából inkább chat, mert a kapott adatok azonnal láthatóak, és a válasz is azonnal adható).

Sorozatunk utolsó részében kibővítjük tudását oly módon, hogy az már képes legyen detektálni saját IP címünket, a Windowsban beállított nevünket, és azt, hogy más gépen fut-e a program – és ha igen, akkor az adott gépet felvesszük egy listába (kilépésekor kivesszük), hogy később tudjunk neki is küldeni, megismerkedünk a „Mindenki” és a „Szonár” fogalmával, naplózunk, és lesz még egy-két meglepetés…

A következő számban felkerül a korongra a teljes példaprogram!

Remélem, velem tartotok a következő alkalommal is!

Üdvözlettel:

Hangya László Tamás (nickek: Gamf Antal,- Anti) anti.gamf@freemail.hu