Capitolul 5 - Lucrul cu clientul

Lucrul cu clientul

Clientul, la rândul său, nu este atât de complex ca un server. De obicei, utilizează numai două mesaje, despre primirea datelor și oprirea sesiunii, și instalează și urmărește o singură conexiune (cu serverul).







Adăugarea principală este că aplicația client trebuie să stabilească parametrii playerului astfel încât nodul principal să le poată obține. Setarea informațiilor despre player este de a popula datele corespunzătoare din structura DPN_PLAYER_INFO și apoi apela funcția IDirectPlay8Client :: SetClientInfo.

Vă interesează numai mai multe domenii ale structurii DPN_PLAYER_INFO - în special pwszName. Un șir care conține șirul Unicode cu numele playerului pe care doriți să îl utilizați. Trebuie să ștergeți structura, setați valoarea dwSize. atribuiți dwInfoFlags la valoarea DPNINFO_NAME | DPNINFO_DATA și specificați numele playerului.

Iată prototipul funcției IDirectPlay8Client :: SetClientInfo:

După cum sa menționat, utilizați același GUID pentru client și server, astfel încât să se poată recunoaște reciproc. Nerespectarea acestei cerințe este unul dintre principalele motive pentru care aplicațiile de rețea nu pot stabili o conexiune, așa că asigurați-vă că GUID-urile aplicației sunt aceleași.

Acum, clientul este gata să se conecteze, dar acum totul va fi puțin diferit. Aici este utilizată funcția IDirectPlay8Client :: Connect. și aici este prototipul acestui hulk:

Am spus că funcția Connect este imensă, dar majoritatea argumentelor sale sunt deja descrise în secțiunea anterioară "Lucrul cu serverul". Cea mai evidentă diferență este adăugarea argumentului pDeviceInfo. care este un obiect IDirectPlay8Address. care conține dispozitivul local utilizat pentru a stabili conexiunea.







Când utilizați o conexiune asincronă, controlul este returnat imediat și trebuie să așteptați mesajul DPN_MSGID_CONNECT_COMPLETE. informând despre conexiunea reușită la server. Cu conexiune sincronă, funcția va reveni la control numai după ce conexiunea este stabilită sau dacă apare o eroare.

Acum, să luăm primul dispozitiv TCP / IP în sistem și să îl acordăm acestei funcții utilizând metoda sincronă de conectare:

Primirea și trimiterea mesajelor

Recepționarea mesajelor pe partea clientului este identică cu primirea acestora pe partea serverului, astfel că vă interesează în interiorul funcției de gestionare a mesajelor. În ceea ce privește trimiterea, aceasta este lucrarea funcției IDirectPlay8Client :: Send:

Ați folosit aceste argumente în secțiunea "Trimiterea mesajelor serverului", deci nu le voi mai descrie. În schimb, voi da un exemplu de construire a unui pachet de date de joc care este trimis către server prin intermediul funcției Trimitere a obiectului client.

Obținerea ID-ului jucătorului

După stabilirea conexiunii cu serverul, va veni un moment în care clientul va avea nevoie de acces la identificatorul acestuia (o astfel de situație veți vedea în Capitolul 15. unde clientul urmărește jucătorii după identificatori). Pentru a obține ID-ul jucătorului, clientul trebuie să analizeze mesajul de configurare a conexiunii (DPN_MSGID_CONNECT_COMPLETE). Acest mesaj utilizează următoarea structură de date, care conține informații importante despre conexiunea dintre client și server:

Acum vă interesează doar o singură informație - câmpul dpnidLocal. care conține ID-ul jucătorului local. Acum, deși restul informațiilor sunt utile, nu ne vom ocupa de ele. De fapt, voi sări peste toate aceste lucruri și mă voi concentra pe dpnidLocal.

În Capitolul 15, veți vedea că atunci când vă conectați la un server, aplicația dvs. client stochează valoarea dpnidLocal. pentru a vă folosi pentru referire la dvs. înșivă. Motivul pentru care te referi la tine este că clientul trebuie să păstreze informații despre fiecare client conectat - amintiți-vă, am spus că ID-ul jucătorului este singura modalitate reală de a distinge un client de altul.

Acum, să adăugăm cunoștințe unei alte informații și să vedem cum să finalizăm sesiunea care a început.

Finalizarea sesiunii de client

Când vine timpul să deconectați clientul de la sesiune, trebuie să îl notificați în mod explicit despre DirectPlay, astfel încât să se ia măsurile necesare pentru a întrerupe conexiunea. Clientul este deconectat de la sesiune cu IDirectPlay8Client :: Close:







Articole similare

Trimiteți-le prietenilor: