W A S M
Az első részben, melynek célja az alapokat ispolzovaniyasoketovMSWindowsv assembler programok, beszéltünk arról, hogy mi az aljzatok, ahogy jönnek létre, és milyen lehetőségek ebben eadayutsya. Aztán mellékesen említi, hogy nem kapcsolatorientált protokoll UDP, ami nem garantálja a szállítás csomagok, valamint az érkezési sorrendben a cél. Az esettanulmány használjuk ezután a kedvenc TCP. És mi volt a jó, de a végén maradt tisztázatlan kérdések, különösen, hogyan kell megszervezni kölcsönös több számítógép között a hálózaton, hogyan kifejezni, hogy minden több számítógép egyszerre, stb
Általánosságban elmondható, hogy az olvasó az első rész, hogy megértsék a jelenlegi nem szükséges, de az út mentén fogom állandóan hivatkoznak rá. Az ilyen esetek. Haha.
Tehát, mi meg a feladatot: van egy helyi hálózaton, például egy tucat számítógépet, meg kell szervezni közötti üzenetváltás bármely kettő, és (adott esetben) egytől az összes többi.
Halljuk, halljuk tippeket kórus, mondván, hogy használja a beépített Windows funkciók, mint például:
net send 192.168.0.4 Jack küldi üdvözletét!
net send Node4 várja a választ!
Rajta már csak két kifogást. Először is, soha nem lehet tudni, hogy mit lehet a mi operációs rendszer vagy más szoftver készen, mert azt szeretnénk, hogy megtanulják, hogyan kell írni a saját programok, nem? És a második, nem az a tény, hogy az üzenet személyenként. Általában az üzemeltető nem tud semmit. És akkor nem kell tudni semmit.
Számomra a legfontosabb a készítményben ez a probléma az volt, hogy lehetőséget teremtsen továbbítja valamit összes számítógépet a hálózaton. Képzeljük el, hogy írtunk egy bizonyos programot. Ki mondta, hogy - a trójai? Nem, nem, nem! Nem trójaiak. Csak egy kis (nagyon) számviteli szoftver, például. Ami még egy idő után, hogy rendezze sok számítógép csatlakozik a LAN. És itt jön a kijelölt időben, itt az ideje, hogy egyensúlyt buldo, rajzolni, hogy úgy mondjam, az eredmény a negyedévben. Mindent meg kell tenni gyorsan, és lehetőleg ugyanabban az időben. Hogyan csináljuk keretében az anyag, amit tanult az első rész, ez maradt.
Reakcióvázlat kölcsönhatásának hálózati protokollok.
TCP - T ransmission C ontrol P kiegészítő jegyzőkönyvét
ICMP - I nternet C ontrol M essage P kiegészítő jegyzőkönyvét (protokolobmenaupravlyayuschimisoobscheniyami)
Általában, ha a kép nem segít, ez nem számít. Fontos, hogy megértsük egy dolog, hogy a TCP - szállítási réteg protokoll, amely megbízható adatok közötti közlekedés a jelentkezési folyamatot azáltal logikai kapcsolatot (kiemelés tőlem). A UDP - nincs. És még egy. Valahol, az alkalmazás szintjén, az egyik üres dobozok és lesz az alkalmazás.
Ezzel befejeződött a bevezető rész és lépni, hogy fontolja meg, hogyan kell használni a kezdetektől fogva.
Annak bizonyítására az anyag, mint mindig, használt az esettanulmány, amely letölthető <здесь>. Ugrás közös az összes Windows-alkalmazások és leírni csak egy része annak, amit működésére vonatkozik aljzatok. Először is meg kell elindítani a Windows Sockets DLL használatával WSAStartup () függvényt. amely nulla értékkel tér vissza, ha sikeres, vagy más módon, az egyik a hibakódok. Ezután az inicializálás során a fő ablak az alkalmazás megnyit egy aljzat üzenetek fogadását:
És ha nincs hiba, meg kell őrizni a jövőbeli használat foglalat fogantyú:
Ezt követően, a szokásos módon, meg kell mondani, hogy a Windows üzeneteket küldeni a megadott ablakot nyitott socket érintkezés:
ahol hSocket - socket leíró
HWND - kezelni az ablakhoz eljárás üzeneteket küldünk
WM_SOCKET - Üzenet nekünk pontban meghatározott .const
FD_READ - maszk, forduljon hozzánk az események ebben az esetben is a hajlandóság a socket olvasni az adatokat.
vagy, pontosabban, használja:
Ezt követően, a kérelem is indult, ami a fő ablakban, akkor meg kell küldeni a Windows WM_CREATE üzenet minden ... csak az ablakai nem jelennek meg az asztalon, vagy a tálcán. Ha ez az, amit akart, örülök. Mindenesetre, mi is.
Ahhoz, hogy ezt elérjük, átalakítja a port számát a hálózati byte sorrendben segítségével egy speciális API függvény:
Egy kis kitérő, opcionális megértéséhez értelmében ezt a cikket.
A port számok a mi aljzatok vitatták meg a végén az első rész. Nehéz, hogy javaslatokat, hogy mit kell tenni. Az egyetlen dolog, amit mondhatok, amit nem lehet. Ez bölcs dolog, hogy próbálja ki a port számát meghatározott közös szolgáltatások, mint például:
keresztül protokolTCP. 20, 21 - ftp; 23 - telnet; 25 - SMTP; 80 - http; 139 - NetBIOS session szolgáltatás;
keresztül protokolUDP. 53 - DNS; 137, 138 - NetBIOS; 161 - SNMP;
Persze, van egy speciális getservbyport () függvény részeként API. amely a megadott portszámot visszaadja a szolgáltatás neve neki. Inkább a funkciót is visszaad egy pointert a szerkezetet, amelyen belül egy mutató a nevét.
Ok lehet, mint ez:
Felhívjuk figyelmét, hogy a jelentések a Win32 Programmer'sReference getservbyport:
”. Ez visszaad egy pointert a szerkezet, amely elkülönített Windows Sockets. Egy alkalmazás soha nem próbálja megváltoztatni a szerkezetét, vagy bármely összetevőjét. Ezen kívül, csak egy másolatot a szerkezet oszlik dlyapotoka, így az alkalmazás másolni információt biztosít, mielőtt bármilyen más Windows Sockets függvényhívás. "
És itt van maga a szerkezet:
Ott az API, hogy úgy mondjam, a „gőz” funkció: getservbyname (). amely az úgynevezett szolgáltatási visszatér tájékoztatás a port számát használják.
Sajnos, a gyakorlatban ezeknek a funkcióknak nem lehet eltávolítani a számunkra. Szóval, tudod, hogy mik ezek és felejtsd el őket.
Ebben az előkészítő munkát létrehozni és konfigurálni a vevő aljzathoz adatgrammokat befejezettnek tekinthető. Nem kell telepíteni a csatlakozó a feltétel függvényében clushaniya port hivatkozhat hallgatni. mint mi a SOCK_STREAM socket az első részben. Most, az eljárás fő ablakában a kérelem mi is hozzá, hogy a kód kerül végrehajtásra, ha kap egy üzenetet egy socket WM_SOCKET:
Most, hogyan lehet megnyitni a socket üzeneteket küldeni. Itt megtalálja az összes szükséges lépést a program:
Mikor jön a adatátvitelt, elég a következő teendő:
paraméterértékek hívás esetén ez a funkció APIsleduyuschie:
Ha amikor a sendto () függvény nem hiba, akkor visszaadja az átvitt bájtok számát, különben a kimenő van a eaxznachenie SOCKET_ERROR.
Ez minden. Abban az időben a záró program szükséges, hogy lezárja a foglalatot és az erőforrások felszabadítása Sockets DLL, ez egyszerű:
Többszálú alkalmazások után WSACleanup befejezett művelet foglalat minden folyót.
A legnehezebb dolog ebben a cikkben volt számomra eldönteni, hogyan legjobban illusztrálni a használatát a Windows Sockets API. Az egyik megközelítés lehet, hogy már láttuk, amikor egy-egy alkalmazás egy időben, és használják foglalattal és az aljzat továbbításáról szóló üzeneteket. Nem kevésbé vonzó és úgy gondolja, egy másik módja, amikor a kódot egymással, és egyértelműen osztották fel, ami van, a különböző alkalmazásokban. A végén rájöttem több, és ez úgy, hogy lehet a kezdők érteni egy kicsit könnyebb. második <архиве> könyvtárak:
\ SocSocDR - a tesztprogram, csak a befogadó rész
\ SocSocDW - illetve csak az adó egy részét
A különbségek már említettek mellett, abban a tényben rejlik, hogy továbbítja a program, ha a „Transfer teszt ...” helyett sendto () függvény az ismerős számunkra az első cikk send () függvényt:
Bezetogofunktsiyasend () fog SOCKET_ERROR!
Végül meg kell jegyezni, néhány gyakori problémák merülnek fel, amikor dolgozik foglalat. Feldolgozni az ablak üzenet arról tájékoztat, hogy a megváltozott állapot az aljzat a szokásos módon, használt közvetlen üzeneteket a Windows alkalmazás főablakát. Van egy másik megközelítés létrehozásakor külön ablakok minden aljzatba.
Általánosságban elmondható, hogy a kommunikáció központi feldolgozás a fő ablak - úgy látszik könnyebb megérteni a módszer, amely azonban a gyakorlatban talán hozzá baj. Ha a program által használt több mint egy socket ugyanabban az időben, meg kell tartani egy listát a socket leírásait. Ha az üzenetet a csatlakozó, a fő ablakban eljárást a listában keres kapcsolatos információk ezen a socket fogantyút, és elküldi az állapot változás üzenet a továbbiakban a megfelelő eljárásokat. Amely már valamilyen módon reagál, hogy ott nem. Ez a megközelítés arra kényszeríti a hálózati feldolgozási feladatok integrált központi program, ami megnehezíti, hogy hozzon létre könyvtárakat a hálózati funkciókat. Minden alkalommal, amikor a hálózati funkciók a fő ablakban felvezető alkalmazásokat kell hozzá további kódot.
A második üzenet feldolgozási módszer az előállításukra, az alkalmazás létrehoz egy rejtett ablak. Arra szolgál, hogy elválassza a fő ablak az alkalmazás feldolgozási eljárásainak hálózati üzeneteket. Ez a megközelítés egyszerűsítheti a fő alkalmazási és elősegíti a meglévő hálózati kódot egyéb programok. A hátránya ennek a megközelítésnek az a túlzott használata a Windows - felhasználói memória, mert Minden létrehozott ablakot fenntartva viszonylag nagy mennyiségű belőle.
Mi a módja annak, hogy válasszon - dönt. És még egy dolog. Abban az időben a kísérletek is, hogy letiltjuk a személyes tűzfalat. Például Outpost Pro 2.1.275 egy tanulási mód, hogy reagáljon, hogy megpróbálja átadni a socket, de amikor a sebességváltó kézi megoldódott, az adatok még nem érte el. Itt van, és az UDP. Bár az ügy nem lehet benne. Gondok vannak az én ZoneAlarmPro 5.0.590 nem volt ugyanaz a helyzet.