Cum se scrie un server tcp

Există o mulțime de materiale scrise despre acest subiect din rețea, atât simple cât și complexe, dar chiar și în cazul unei astfel de abundențe de informații nu este ușor să înțelegem subiectul. Dacă aveți nevoie să scrieți un server care poate gestiona mai multe conexiuni simultane, lucrând rapid și sigur, sarcina este mult mai complicată. De ce este atât de dificil să stăpânești întrebarea? Cred că motivele sunt după cum urmează.







2. Fiecare platformă are propria sa împachetare la rețeaua IP. De exemplu, în MFC (Visual Studio) este CSocket în Delphi TSocket, TServerSocket, TClientSocket. exemple simple de ajutor sau de pe internet, de obicei, funcționează bine, dar dacă ai nevoie de ceva pentru a reface - erori de interceptare, de a organiza procesarea mai multe conexiuni simultane la serverul - wrapperul complica sarcina, și bun exemplu / clar este mai greu de găsit.

3. ambalaje de aplicații de înaltă calitate adică cel puțin o familiaritate dur cu funcții și principii ale bibliotecii Windows Sockets de bază - în caz contrar va fi dificil să înțeleagă și să aplice multe din proprietățile și metodele de ambalaje (cum ar fi cele asociate cu blocarea Windows Sockets funcții).

4. Dacă decideți să renunțe la ambalajele în favoarea apel direct funcții Windows Sockets (alegere bună!) - Fii pregătit pentru faptul că va lua o bună cunoaștere a scrie aplicații multi-threaded, metodele corecte de alocare și deallocation, callback (apel invers), inter-fire interacțiuni, și așa mai departe. n. Toate acestea se datorează faptului că multe Sockets funcție windows pentru a bloca progresul programului.

5. Pentru scrierea Winsock aplicației poate utiliza cinci modele IOCTL (selectați, WSAAsyncSelect, WSAEventSelect, suprapus și porturile de finalizare IO). Înțelegerea acestor tehnologii și alegerea unei singure (sau mai multe) pentru ele însele nu pot fi o sarcină ușoară.







Vă sugerez să scrieți un server cu mai multe fire în această ordine:

1. Trebuie să descărcați versiunea corectă a bibliotecii Winsock. Am folosit versiunea 2.0, deși versiunea 2.2 există deja. Acest lucru se face astfel:

Dacă eroarea nu este 0, atunci a apărut o eroare (err conține un cod de eroare, care poate fi decriptat de rutina WSA_Err_Decode). În caz de eroare, terminăm programul.

2 [puteți săriți]. Verificăm versiunea bibliotecii încărcate. Ar trebui să fie egală cu cea solicitată.

3 [puteți săriți]. Obțineți informații despre cantitatea de memorie necesară pentru a consulta protocoalele.

4 [puteți săriți]. WSAGetLastError () ar trebui să returneze WSAENOBUFS.

5 [puteți săriți]. Alocarea memoriei pentru interogarea protocolului.

6 [puteți săriți]. Descărcarea informațiilor de protocol în memorie.

7 [puteți săriți]. Interogarea tuturor protocoalelor disponibile și căutarea printre ele este necesară (programul meu folosește TCP / IP, iar condiția va fi

(wsapi-> iAddressFamily == AF_INET) (wsapi-> iProtocol == IPPROTO_TCP)).

8. Creați un soclu care acceptă conexiuni apelând WSASocket. Dacă WSASocket a returnat INVALID_SOCKET, obținem codul de eroare pentru WSAGetLastError și terminăm programul. Codul de eroare poate fi decriptat prin subrutina WSA_Err_Decode.

10. Transferați soclul pentru a recepționa conexiunile sau modul de ascultare. În acest stadiu, se specifică numărul maxim de conexiuni permise. Dacă ascultarea nu a returnat 0, atunci a apărut o eroare. Obținem codul de eroare pentru WSAGetLastError și terminăm programul. Codul de eroare poate fi decriptat prin subrutina WSA_Err_Decode.

11. Apoi este lansat ciclul de așteptare infinit al clienților. În corpul acestui ciclu, există o metodă de blocare acceptă - ciclul ciclului este oprit până când orice client se conectează. Această metodă acceptă returnează un mâner socket prin care puteți lucra cu clientul conectat. Prin acest soclu, există un schimb suplimentar de date cu clientul. Dacă serverul nostru are nevoie pentru a servi mai mulți clienți (și ne-am dorit acest lucru), apoi la acest punct pe care doriți să înceapă 2 flux, care va lucra cu socket client (una pentru recepție, celălalt pentru transferul). 2 flux, mai degrabă decât unul, sunt necesare, deoarece metoda recv, care citește date de la priza, blocarea (există și alte opțiuni, dar nu voi discuta, pentru aceasta este literatura de specialitate).

Asta e tot (?) Că trebuie să știți să scrieți un server "real".







Articole similare

Trimiteți-le prietenilor: