Amudaryo muhandislik texnikumi


-Mavzu: Soketlarni boshqarish



Download 2,68 Mb.
bet26/32
Sana21.09.2022
Hajmi2,68 Mb.
#849794
1   ...   22   23   24   25   26   27   28   29   ...   32
Bog'liq
Ob\'ektga yo’naltirilgan va tarmoq dasturlash

7-Mavzu: Soketlarni boshqarish
Reja:
1. Tarmoqli ilovalarni qo'llab -quvvatlash
2. Barcha tarmoq ilovalari
Tarmoqli ilovalarni qo'llab -quvvatlash uchun soket deb nomlangan texnologiya mavjud. Soket - bu o'ziga xos xususiyatlari va usullari bilan ulanishning bir uchining modeli. Aslida, bu ko'plab operatsion tizimlarga (OS) kiritilgan va OSning tarmoq imkoniyatlarini qo'llab -quvvatlash uchun mo'ljallangan, dasturiy dasturlash interfeysi. Etti qatlamli OSI modelining protokol tuzilishi standartida rozetkalar transport qatlami deb ataladi, quyida tarmoq protokoli ip, yuqorida esa ftp, pp3, smtp va boshqalar kabi sessiya darajasidagi protokollar joylashgan.
Windows 3.11 versiyasidan beri rozetkalarni qo'llab -quvvatlashni o'z ichiga oladi va u winksock deb nomlanadi. Tarmoqni qo'llab -quvvatlaydigan ilovalarni yozish uchun maxsus winsock api mavjud.
Barcha tarmoq ilovalari mijoz-server texnologiyasiga asoslangan; bu shuni anglatadiki, tarmoqdagi kamida bitta dastur mavjud, bu odatiy vazifa - bu mijoz dasturlaridan ulanish so'rovini kutish, ulardan nazariy jihatdan siz xohlagancha ko'p bo'lishi va har xil turdagi bajarilishi mumkin. mijozlarning talablariga javob beradigan protseduralar. Mijoz -server texnologiyasi uchun mijoz va server qaerda joylashganligi muhim emas - bitta mashinada yoki boshqasida. Albatta, mijoz serverga muvaffaqiyatli ulanishi uchun mijoz server joylashuvi to'g'risida minimal ma'lumotlarga ega bo'lishi kerak - tcp / ip tarmoqlari uchun bu server joylashgan kompyuterning IP -manzili. server mijozlarning so'rovlarini tinglaydigan portning manzili.
Shunday qilib, manzil + port juftligi - bu ikkita kompyuter bir -biri bilan aloqa qiladigan soket kanali. Bitta kompyuterda bir vaqtning o'zida faqat bitta dastur ma'lum bir portdan foydalanishi mumkin, lekin server tomonidan bir nechta mijozlar bilan ishlash uchun bitta portda bir nechta rozetka yaratish mumkin. Port - 0 dan 65535 gacha bo'lgan raqam.
Serverda va mijozda port qiymati bir xil bo'lishi shart emas - mijoz ulanish uchun faqat server portini bilishi kerak, mijoz portini o'zboshimchalik bilan mijoz tanlaydi va mijoz so'raganda serverga ma'lum bo'ladi. aloqa. Ulanish o'rnatilganda, OS server ilovasi uchun mos keladigan rozetkani yaratadi, u bilan dastur ishlaydi, shuning uchun serverning mijoz porti umuman ahamiyatsiz.
Soketning ishlash mexanizmi quyidagicha: server tomonida server soketi ishga tushiriladi, u ishga tushirilgandan so'ng darhol "tinglash" rejimiga o'tadi (ya'ni mijoz ulanishini kutadi). Mijoz tomonida rozetka yaratiladi, u uchun serverning IP-manzili va porti ko'rsatiladi va ulanish buyrug'i beriladi. Server ulanish so'rovini olganda, OS mijoz bilan aloqa o'rnatishi mumkin bo'lgan yangi rozetka misolini yaratadi. Bunday holda, "tinglash" uchun yaratilgan soket ulanishlarni qabul qilish rejimida qolishda davom etadi, shuning uchun dasturchi mijozlarning bir nechta ulanishlari bilan ishlaydigan serverni yaratishi mumkin.
Soket bilan ishlash, asosan, sinxron yoki asenkron bo'lishi mumkin bo'lgan kirish -chiqishdir. Asenkron operatsiyani soket terminologiyasida blokirovka qiluvchi soketlar, sinxron rejimda esa blokirovka qilmaydigan soketlar deyiladi. Ma'lumotni blokirovka qilish rejimida ulash yoki qabul qilishga urinish (yuborish har doim sinxron bo'ladi, chunki u navbatda turadi), dastur ulanmaguncha yoki ma'lumotlarni qabul qilmaguncha boshqaruv keyingi operatorga o'tkazilmaydi.
Keling, asosiy mijoz va serverni yozish uchun kerak bo'lgan winsock api -dan minimal funktsiyalar to'plamini ko'rib chiqaylik. Funktsiyalarning o'zi winsock.dll faylida joylashgan. Winsock.pas fayli kerakli import winsock api funktsiyasi deklaratsiyalari va asosiy ma'lumotlar tuzilmalarini o'z ichiga oladi. Afsuski, bu fayl bizga kerak bo'lgan barcha funktsiyalarni import qilmaydi va keyinchalik biz import faylini yozamiz.
wsastartup funktsiyasi (wversionrequired: word; var wsdata:
twsadata): butun son; stdcall;
Vazifa OS -ga winsock funktsiyalari har qanday dastur jarayonida ishlatilishi mumkinligini aytadi. WinSock funktsiyasini ishlatishdan oldin, funktsiyani ishga tushirish paytida bir marta chaqirish kerak.
wsacleanup funktsiyasi: butun son; stdcall;
Funktsiya OS -ga dastur endi winsock ishlatmasligini bildiradi. Bu funksiya ilovadan chiqishdan oldin chaqirilishi kerak.
funktsiya soketi (af, struktura, protokol: tamsayı):
tsocket; stdcall;
Funktsiya soket hosil qiladi. Port va manzil bind (server) yoki ulanish (mijoz) funktsiyasida o'rnatiladi. Kirish parametri af - bu rozetkalar oilasining spetsifikatsiyasi (af_inet, af_ipx va boshqalar), struct - bu yangi soket turining spetsifikatsiyasi (paypoq oqimi yoki sock_dgram qiymatini oladi), protokol - bu ishlatiladigan maxsus protokol rozetka tomonidan. Agar funksiya xatosiz bajarilsa, u dastani yangi rozetkaga qaytaradi, agar xatolar bo'lsa, yaroqsiz rozetka qaytariladi.
ulanish funktsiyasi (lar: tsocket; var nomi: tsockaddr;
nomelen: butun son): butun son; stdcall;
Mijozlarni ulash funktsiyasi. Manzil tuzilmasida port (htons funktsiyasi bilan ko'rsatilishi kerak) va manzil mavjud (mijoz uchun ip4 spetsifikatsiyasi - xxx.xxx.xxxx.xxx).
funktsiya bind (s: tsocket; var addr: tsockaddr; namelen: integer): tamsayı; stdcall;
Funktsiya manzilni rozetka bilan bog'laydi. Manzil tuzilmasida port (htons funktsiyasidan foydalanib ko'rsatilishi kerak) va manzil (server uchun, inaddr har qanday odatda ko'rsatiladi - har qanday) mavjud.
send funksiyasi (s: tsocket; var buf; len, bayroqlar: tamsayı): tamsayı; stdcall;
Ma'lumot yuborish funktsiyasi. Bufdan uzunlikdagi lenli navbatlar soketlari. Oxirgi parametr xabarlarni uzatish turi uchun javobgardir. E'tibor bermaslik mumkin (0).
recv funktsiyasi (s: tsocket; var buf; len, bayroqlar: tamsayı): tamsayı; stdcall;
Ma'lumotlarni qidirish funktsiyasi.
Shunday qilib, keling, oddiy server va mijoz misollarini ko'rib chiqaylik. Keling, server asenkron (blokirovka qilish) rejimida ishlashiga rozilik bildiraylik. Serverning yagona funktsiyasi - mijozdan ma'lumotlar qatorini olish va ularni ekranda ko'rsatish. Mijoz-server aloqasi bitta "q" belgisidan iborat qatorni olgandan keyin uziladi.
Serverga bir nechta mijozlar ulanishini ta'minlash uchun server har bir ulanish uchun alohida tarmoqni ishga tushiradi.
winsock_server dasturi;
// Eng oddiy server dasturi.
// Soketlar blokirovka rejimida ishlaydi.
// Har bir ulanish uchun alohida mavzu yaratiladi.
{$ apptype console} ishlatiladi
sysutillar, winksock, derazalar; var
vwsadata: twsadata; vlistensocket, vsocket: tsocket; vsockaddr: tsockaddr;
trid: tayoq; const
cport = so'z (33); csigexit = 'q';
// Har bir mijoz uchun alohida mavzu yaratish tartibi.
rozetka protsedurasi;
var sockname: tsockaddr;
abuf: char qatori;
vbuf: satr;
vsize: butun son;
s: tsocket;
bufsize: butun son;
boshlash
s: = vsocket;
agar s = invalid_socket bo'lsa, u holda chiqish; vsize: = sizeof (tsockaddr); getpeername (lar, sockname, vsize);
writeln (format ('mijoz qabul qilindi, masofaviy manzil [% s].', [inet_ntoa (sockname.sin_addr)])));
// Soket uchun o'qiladigan bufer hajmini aniqlang, vsize: = sizeof (bufsize);
getsockopt (lar, sol_socket, so_rcvbuf, pchar (@ bufsize), vsize);
writeln (format ('bufer hajmini qabul qilish [% d]', [bufsize])));
to'siq uzunligi (abuf, bufsize);
takrorlash
// Ma'lumot olish. Protsedura // rejimini blokirovka qilishda ishlaydi, shuning uchun kodning keyingi qatori // mijozdan ma'lumotlar // kelmaguncha nazoratni olmaydi.
vsize: = recv (s, abuf [0], bufsize, 0); agar vsize <= 0 bo'lsa, uzing; o'rnatish uzunligi (vbuf, vsize); lstrcpyn (@vbuf [1], @ abuf [0], vsize);
writeln (format ('cleint -dan olingan:% s', [vbuf])); vbuf = 'q' ga qadar;
writeln (format ('mijoz uzilgan, masofaviy manzil)
[% s]. ', [inet_ntoa (sockname.sin_addr)]));
to'siq uzunligi (abuf, 0);
shkaf (lar);
oxiri;
boshlash
• • •
writeln ('ilovani ishga tushirish ...');
// Biz dastur // oyna soketlarini ishlatishini e'lon qilamiz.
agar wsastartup ($ 101, vwsadata) <> 0 bo'lsa, to'xtating (l); writeln ('Windows rozetkalari yordamida.');
// Tinglash rozetkasini yarating, vlistensocket: =
soket (af_inet, sock_stream, ipproto_ip); writeln (format ('portda rozetka yaratish [% d].', [cport])));
agar vlistensocket = invalid_socket bo'lsa, to'xtating (l); to'ldirish (vsockaddr, sizeof (tsockaddr), 0); vsockaddr.sin_family: = af_inet; vsockaddr.sin_port: = htons (cport); vsockaddr.sin_addr.s_addr: = inaddr_any; writeln ('ulash rozetkasi ...');
// Manzil va portni rozetkaga ulang.
if bind (vlistensocket, vsockaddr, sizeof (tsockaddr)) <> 0 keyin to'xtatish (1);
// Eshitishni boshlang.
agar tinglasangiz (vlistensocket, somaxconn) <> 0
keyin to'xtating (1);
writeln ('soket holati: tinglash.'); takrorlash
// Ulanish kutilmoqda.
vsocket: = qabul qilish (vlistensocket, nil, nil);
// Mijoz ulandi, biz ulanish uchun yangi jarayonni boshlaymiz.
yaratuvchi ip (nil, 0, @ socketthread, 0,0, trid); yolg'on bo'lguncha;
yopiq rozetka (vlistensocket);
sardorlik;
oxiri
Kod ilgari ta'riflanmagan getpeername () funktsiyasidan foydalangan, u rozetka bilan bog'liq kanal haqidagi ma'lumotlarni qaytaradi. Shu nuqtai nazardan, ulangan mijozning IP-manzili haqida ma'lumot olish kerak. Win32 funktsiyasining boshqa funktsiyalari singari, bu funktsiya haqida ham ma'lumotni Win32 dasturchisi ma'lumotnomasining bir qismi bo'lgan Windows socket 2 dasturining dastur interfeysida topish mumkin.
Yuqoridagi kodni faqat darslik sifatida ishlatish mumkin. Haqiqiy dastur uchun asos sifatida foydalanish uchun ba'zi ishlarni bajarish kerak bo'ladi, chunki kelajakda jiddiy xatolarga olib kelishi mumkin bo'lgan ko'p narsalar ataylab kod hajmini kamaytirish va winksokdan foydalanish jihatlariga e'tibor qaratish uchun qoldirilgan. Agar siz derazalardagi iplar kontseptsiyasini yaxshi bilmasangiz, delphi -da ko'p tishli ilovalarni qo'llab -quvvatlash uchun mavjud bo'lgan tthread sinfidan foydalanish yaxshiroqdir. Mijozning manba kodi quyida ko'rsatilgan:
winsock_client dasturi;
{$ apptype console} ishlatiladi
sisutillar,
yutuq;
const
cport = 33; csigexit = 'q'; var
vwsadata: twsadata; vsocket: tsocket; vsockaddr: tsockaddr; buf: string; boshlash
agar wsastartup ($ 101, vwsadata) <> 0 bo'lsa, to'xtating (l); vsocket: = soket (af_inet, sock_stream, ipproto_ip); agar vsocket = invalid_socket bo'lsa, to'xtating (l); to'ldirish (vsockaddr, sizeof (tsockaddr), 0); vsockaddr.sin_family: = af_inet; vsockaddr.sin_port: = htons (cport);
vsockaddr.sin_addr.s_addr: = inet_addr ('127.0.0.1'); agar ulanish (vsocket, vsockaddr, sizeof (tsockaddr)) = socket_error keyin to'xtatish (l);
readln (buf) ni takrorlang;
agar yuborilsa (vsocket, buf [1], length (buf), 0) = socket_error
keyin sindirish;
buf = csigexitgacha;
yopiq rozetka (vsocket);
sardorlik;
oxiri
Shunday qilib, biz rozetkalarning asenkron rejimda qanday ishlashini ko'rdik. Keling, winsock bizga qanday blokirovka qilmaydigan soketlarni taqdim etishini ko'rib chiqaylik.
Soketni blokirovka qilmaydigan rejimga o'tkazish uchun rozetkaning ish rejimlarini boshqarish uchun ioctlsocket (...) funktsiyasi ishlatiladi.
Hozirda serverning recv funktsiyasi, soket tamponida ma'lumotlar mavjudligidan qat'i nazar, boshqaruvni darhol qaytaradi, endi bizga rozetkada sodir bo'ladigan hodisalarni aniqlashga imkon beradigan mexanizm kerak. Buning uchun bir nechta mexanizmlar mavjud. Biz ko'rib chiqadigan birinchi narsa - tanlash (...) funktsiyasidan foydalanish.
funktsiyani tanlash (nfds: integer; readfds, writefds,
istisnolar: pfdset; vaqt tugashi: ptimeval): longint;
stdcall;
Bu funksiya rozetkalar majmuasining holatini kuzatish imkonini beradi.
Nfds argumenti e'tiborga olinmaydi va faqat moslik uchun saqlanadi. 0. readfs, writefds, exceptfds - o'qish holatini nazorat qilmoqchi bo'lgan rozetkalarga ko'rsatgichlar, mos ravishda ma'lumotlar va xatolarni yuborish bilan teng bo'lishi kerak. To'plamlar pfdset tuzilmasida saqlanadi, u winsock.pas -da tasvirlangan maxsus makrolar tomonidan boshqariladi:
protsedura fs_zero (var fdset: tfdset);
Strukturani nolga tenglashtiradi, kuzatiladigan rozetkalar sonini 0 ga o'rnatadi.
protsedura fd_set (soket: tsocket; var fdset: tfdset);
Belgilangan rozetkani tuzilishga qo'shadi.
protsedura fd_clr (soket: tsocket; var fdset: tfdset);
Belgilangan rozetkani strukturadan olib tashlaydi.
fd_isset funktsiyasi (soket: tsocket; var fdset: tfdset):
boolean
Agar ko'rsatilgan soket belgilangan strukturaning a'zosi bo'lsa, rostni qaytaradi.
Vaqt tugashi argumenti ptimeval tipidagi tuzilmaga havola bo'lib, unda siz tanlangan funksiyaning ishga tushishini kutish vaqtini belgilashingiz mumkin. Agar siz tanaffus vaqti 0 yoki nilga kechikish vaqtini belgilasangiz, tanlash funktsiyasi blokirovka rejimida operatsiyani bajarayotgandek, abadiy kutib turadi.
Ta'rifdan ko'rinib turibdiki, funktsiya bir vaqtning o'zida bir nechta rozetkalarni kuzatishi mumkin, shuning uchun endi biz har bir ochiq rozetka uchun alohida jarayonni boshlay olamiz, u ma'lum bir rozetkani kuzatadi yoki bitta ochiq rozetkalarni kuzatadigan jarayonni yaratadi. Birinchi holda, biz rozetka protsedurasiga ozgina o'zgartirishlar kiritishimiz kerak, ikkinchidan, biz juda muhim o'zgarishlarga muhtojmiz.
Keling, ikkinchi holatda ish mantig'ini ko'rib chiqaylik, chunki birinchi holat ahamiyatsiz.
Birinchidan, dasturning asosiy qismida siz yangi yaratilgan rozetkani blokirovka qilmaydigan rejimga o'tkazishingiz kerak:
arg: = 1;
ioctlsocket (rozetka, fionbio, arg);
E'tibor bering, rozetkani yopishdan oldin uni blokirovka holatiga qaytarish kerak bo'ladi:
arg: = 0;
ioctlsocket (rozetka, fionbio, arg);
Keyin har bir rozetkani zoskaggau qatoriga saqlash qobiliyatini amalga oshirish kerak. Keyinchalik, mijozni qayta ishlash bilan shug'ullanadigan ip faqat bir marta ishlashiga ishonch hosil qilishingiz kerak. Createthread protsedurasi o'zgaruvchining yangi yaratilgan ipga havolani qaytarishini bilgan holda buni bajarish oson, bu ipning yaratilganligini tekshirish uchun ishlatilishi kerak. Tanlash funktsiyasidan foydalanish uchun ish jarayonida quyidagi o'zgarishlar kiritilishi kerak:
Keling, wfds: tfdset; i: butun son; TV: vaqt vaqti. Keyin biz ma'lumotlarni qayta ishlaydigan asosiy tsiklni aniqlaymiz:
takrorlash
Connum> 0 ga qadar;
Bu pastadirda, birinchi navbatda, kuzatiladigan rozetkalar to'plamini o'z ichiga olgan wfds tuzilmasini yaratish kerak. Buning uchun biz rozetkalarni u erdan o'tkazamiz:
fd_zero (wfds);
i uchun: = l to connum do
boshlash
fd_set (paypoq [i], wfds); oxiri;
Keyinchalik, biz televizor tuzilmasida funksiyaning kechikish vaqtini ko'rsatamiz
tanlang:
tv.tv_sec: = 5; tv.tv_usec: = 0;
Endi siz tanlash funktsiyasiga qo'ng'iroq qilishingiz mumkin (chunki biz faqat ma'lumotlarni qabul qilishni kuzatamiz, nolni writefds sifatida belgilaymiz, bundan tashqariffds):
tanlang (0, @ wfds, nil, nil, @ tv);
Endi, tanlash funktsiyasi wfds o'zgaruvchisini boshqarishni qaytarganda, biz o'qish uchun rozetkalar to'plamiga ega bo'lamiz va olingan ma'lumotlarni qayta ishlashimiz mumkin:
agar wfds.fd_count = 0 bo'lsa, davom eting; i: = 0 uchun wfds.fd_count-l boshlanadi
vsocket: = wfds.fd_array [i];
// Kiruvchi ma'lumotlarni soket vsocketdan qayta ishlash. oxiri;
Asosiy halqadan chiqish sharti - sokkarrayda ochiq rozetkalar yo'q. Biz rozetkani yopish shartlarini o'quvchining vijdoniga qoldiramiz, faqat shuni qo'shamizki, rozetkani uzilish hodisasi yuz berganda ham, u tanlanadi. recv funktsiyasi nolga teng bo'ladi, shuningdek wsagetlasterror funktsiyasi).
Keling, nima uchun yuborish funktsiyasining vaqtini aniqladik va uni cheksiz qilmadik? Gap shundaki, joriy amaliyotda, yangi rozetka yaratilganda, fs_set funktsiyasi o'rnatilmaguncha, u tanlangan tomonidan qayta ishlanmaydi, bu esa, albatta, tanlangan voqea bilan boshqaruvni qaytarmaguncha, blokirovka rejimida o'tmaydi. kuzatiladigan mijozlardan biri. Vaqt tugashi qiymatini o'rnatish, rozetkaning boshqa rozetkalarning holatidan qat'i nazar, qayta ishlanishini ta'minlaydi.


Download 2,68 Mb.

Do'stlaringiz bilan baham:
1   ...   22   23   24   25   26   27   28   29   ...   32




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish