Hogyan írjunk egy TCP szerver
Ebben a témában a hálózat van írva egy csomó anyagot, egyszerű és összetett, de még a ilyen rengeteg információt, hogy megértsük a tárgy nem könnyű. Ha meg kell írni egy szerver, amely képes kezelni több egyidejű kapcsolatot futó gyorsan és megbízhatóan, a feladat lesz sokkal bonyolultabb. Miért van az a kérdés, annyira nehéz, hogy dolgozzon? Azt hiszem, az okok a következők.
2. Minden egyes platform, a csomagolására, hogy a hálózat IP. Például az MFC (Visual Studio) a CSocket Delphi TSocket, TServerSocket, TClientSocket. Egyszerű példák segítségével vagy az interneten általában jól működik, de ha kell valami, hogy remake - lehallgatott hibák, szervezni feldolgozása több egyidejű kapcsolatot a szerver - wrapper csak bonyolítja a feladatot, és a jó / világos példája nehezebb megtalálni.
3. Kiváló minőségű alkalmazás göngyölő jelenti, hogy legalább egy durva ismerete alapvető funkcióit és alapelveit Windows Sockets könyvtár - egyébként nehéz lesz megérteni és alkalmazni sok a tulajdonságok és módszerek csomagolóanyagok (például a kapcsolódó blokkoló Windows Sockets funkciók).
4. Ha úgy dönt, hogy feladja a csomagolóanyagokat javára közvetlenül hívja a Windows Sockets funkciók (jó választás!) - Legyen felkészülve arra, hogy ez lesz a jó ismerete írásban többszálas alkalmazások, a helyes módszerek felosztása és felszabadítása, a visszahívás (a visszahívás), inter-szál kölcsönhatások, és így tovább. n. Mindez azért van, mert sok a Windows Sockets működik, hogy megakadályozza a program előrehaladásáról.
5. írásban Winsock-alkalmazások használhatják öt modell IOCTL (válassza, WSAAsyncSelect, WSAEventSelect, átlapolt és IO befejezése portok). Ahhoz, hogy megértsük ezeket a technológiákat, és válassza ki az egyik (vagy több) is bonyolult.
Írja többszálú szerver ajánlat a következő sorrendben:
1. Meg kell töltse le a megfelelő verziót a Winsock könyvtárban. Régebben 2.0 verzió, bár 2.2-es verzió már létezik. Íme:
Ha err nem 0, akkor hiba történt (err tartalmaz egy hibakódot, amely képes dekódolni szubrutin WSA_Err_Decode). A hiba esetén lezárja a programot.
2 [kihagyhatja]. Ellenőrizze a változat a betöltött könyvtár. Meg kell kérni.
3 [kihagyhatja]. Első információt, hogy mennyi memória van szüksége, hogy feltérképezzük protokollokat.
4 [kihagyhatja]. WSAGetLastError () vissza kell WSAENOBUFS.
5 [kihagyhatja]. Memória allokáció szavazóhelyiségek protokollok.
6 [kihagyhatja]. Betöltése a memóriába az információkat a protokollokat.
7 [kihagyhatja]. A felmérés az összes rendelkezésre álló protokollok és keresni közöttük jobbról (a programot használja a TCP / IP, és a feltétel lesz
(Wsapi-> iAddressFamily == AF_INET) (Wsapi-> iProtocol == IPPROTO_TCP)).
8. Készítsen aljzatba, hogy fogadja a hívást kapcsolat WSASocket. Ha WSASocket visszatért INVALID_SOCKET, akkor megkapjuk a WSAGetLastError hibakódot és kilépünk a programból. A hibakód visszafejteni rutin WSA_Err_Decode.
10. Translation az aljzat vételi módba, a bejövő kapcsolatokat vagy hallgatási mód (hallgatni). Ebben a szakaszban megadja a maximális számú engedélyezett kapcsolatokat. Ha hallgatni vissza nem 0, akkor hiba történt. Kijövünk WSAGetLastError hibakódot és kilépünk a programból. A hibakód visszafejteni rutin WSA_Err_Decode.
11. Ezután elindul egy végtelen ciklusban várja az ügyfelek számára. A szervezetben ez a ciklus van egy blokkoló módszer elfogadni - görgetés ciklus megáll, amíg prikonnektitsya bármely ügyfél. Ez a módszer fogadja vissza a foglalat fogantyú, amelyen keresztül tud dolgozni a csatlakoztatott kliens. Ezzel aljzat, és van egy további kommunikáció az ügyféllel. Ha a szerver kell szolgálni több ügyfél (és így akarta), akkor ezen a ponton meg kívánja kezdeni, 2 patak, amely együttműködik a kliens socket (egy fogadás, a másik pedig a transzfer). 2 adatfolyam ahelyett, hogy egy, azért szükségesek, mert recv módszer, amely adatokat olvas az aljzatba, blokkoló (vannak más lehetőségek, de nem fogok beszélni, mert ez a szakirodalom).
Ez minden (?) Meg kell tudni, hogy írjon „vsamdelishny” szerver.