fbpx
Wikipedia

Nəqliyyat xidməti

== Berkeley soketləri ==

Soketlər ilk əvvəl 1983 də Berkeley UNİX 4.2 BSD program paylayıcısının bir parçası olaraq tanıdıldı. Onlar tez bir zamanda populyar oldular. Primitivlər hal-hazırda bir çox əməliyyat sistemləri tərəfindən özəlliklə UNİX əsaslı sistemlərdə internet proqramlaşdırma üçün ən çox istifadə olunandır və Windows üçün “winsock” adlı bir soket tərzi API vardır.

Şəkil1

Primitivlər Şəkil 2 də listlənmişdir. Kobudca desək, ilk misalımızın modelini təqib edirlər ancaq daha çox özəllik və çeviklik verir.

Şəkil 2 TCP üçün soket primitivləri
Primitiv Mənası
SOCKET Yeni bir əlaqə son nöqtəsi yaradır.
BIND Lokal bir adresi bir soketlə əlaqələndirin.
LISTEN Əlaqələri qəbul etmə istəyini elan edir; sıra ölçüsü ver
ACCEPT Gələn əlaqəni passiv olaraq qurur
CONNECT Aktiv olaraq bir əlaqə qurmağa çalışır
SEND Əlaqə üzərindən bəzi məlumatlar göndərir
RECEIVE Əlaqədən bəzi məlumatlar qəbul edir
CLOSE Əlaqəni azad edir

Cədvəldəki ilk dörd primitiv sırayla serverlər tərəfindən icra olunur. SOCKET primitiv obyekti yeni son nöqtə yaradır və onun üçün daşıma obyektinin içində cədvəl sahəsi ayırır. Çağırış parametrləri istifadə olunacaq adresləmə formatını, arzulanan servis növünü (məs, güvənilir bayt axışı) və protokolu müəyyən edir. Müvəffəqiyətli bir SOCKET çağırışı bir fayldakı OPEN çağırışı kimi müvəffəqiyyətli çağırılışlarda istifadə olunacaq adi bir fayl deskriptoru geri qaytarır.

Yeni yaradılan soketlərin şəbəkə adresləri yoxdur. Bunlar BIND primitivini istifadə edərək təyin edilir. Bir server bir adresi bir soketə bağladıqdan sonra, uzaqdakı klentlər ona qoşula bilər. SOCKET çağrısının bibaşa bir adres yaratmasını istəməməsinin səbəbi, bəzi prosesslərin adreslərini önəmsədiyi(digər bir deyişlə illərcə eyni adresi istifadə etmələri və hərkəsin bu adresi bilməsidir) digərlərinin isə etmədiyi bir vəziyyətdir.

Sonrasında bir neçə klentin eyni zamanda qoşulmağa cəhd etməsi vəziyyətində gələn çağrışları sıraya alan LİSTEN çağrışıdır. İlk misalımızda LİSTEN-ın əksinə, soket modelində LİSTEN bir bloklama çağırışı deyil. Gələn bir qoşulmanı gözləməkdən əl çəkmək üçün server ACCEPT primitivini icra edir. Qoşulma istəyən bir bölüm gəldiyində, daşıma obyekti orjinalıyla eyni özəlliklərə sahib yeni bir soket yaradır və bunun üçün bir fayl deskriptor qaytarır. Server daha sonra yeni soketdəki qoşulmanı icra etmək və orjinal soketdəki bir sonrakı qoşulmanı gözləmək üzərə geri qayıtmaq eçen bir prosesi və ya tredi çıxarda bilər. ACCEPT fayllar üçün olduğu kimi standart bir şəkildə oxuma və yazma üçün istifadə olna bilən bir fayl deskriptoru qaytarır. İndi müştəri tərəfinə baxaq. Burada da ilk əvvəl bir soket SOCKET primitiv istifadə edilərək yaradılmalıdır, amma istifadə olunan adres server üçün önəmli olmadığından BIND lazımlı deyildir. CONNECT çağırışçını

 Blokluyur və əlaqə prosesini aktiv başladır. Proses tamamlandıqda klent  prosesi əngəli qalxır və əlaqə qurulur. Artıq hər iki tərəf də , full-duplex əlaqə üzərindən məlumat göndərmək və almaq üçün SEND və RECEİVE özəlliyini istifadə ediləbilər. Standart UNIX READ və WRITE sistem çağırışları, SEN və RECEİVE özəl seçənəklərindən heçbirinin lazım olmaması vəziyyətində istifadə edilə bilər.Soketlərlə əlaqə sərbəst buraxılması simmetrikdir. Hər iki tərəf bir CLOSE primitivini icra olunduqda, əlaqə sərbəst qalır.Soket API-sinin gücü bir proqram tərəfindən digər daşıma xidmətləri üçün istifadə edilə bilər. Məsələn soketlər əlaqəsiz bir daşıma xidməti ilə istifadə oluna bilər.

Soket API-nin gücü bir proqram tərəfindən digər daşıma xidmətləri üçün istifadə oluna bilər. Məsələn soketlər əlaqəsiz bir daşıma xidməti ilə istifadə edilə bilər. Bu vəziyyətdə CONNECT uzaq daşıma cütünün adresini quraşdırar və SEND və RECEİVE uzaq cütdən gələn və uzaqdakı cütlərdən dataqramları göndərib almağa yarıyır. Soketlər həmçinin , bir bayt axışı yerinə məlumat axışı təchiz edən və tıxanıqlıq idarəsi olan və ya olmayan bir daşıma protokolları ilə istifadə edilə bilər. Məsələn DCCP(Datagram Congestion Controlled Protocol) tıxanıqlıq idarəsi olan UDP versiyasıdır. Bununla birlikdə soketlər daşıma interfeysi üzərindəki son sözü olmayacaqdır. Məsələn proqramlar əsasən eyni serverdən bir neçə obyekt istəyən Web brauzer kimi bir qrup əlaqəli axınla işləyir. Soketlərlə ən təbii uyumu aplikasiya proqramları üçün obyekt başına bir axın istifadə olunmasıdır. Bu struktur tıxanıqlıq kontrolu, hər bir axın üçün ayrı olaraq tətbiq olunması mənasına gəlir, qrup arasında deyil. Əlaqəli protokol qruplarını aplikasiya üçün daha effektiv və bəsit bir şəkildə dəstəkləyən daha yeni protokollar və interfeyslər dizayn edilmişdir.İki misal, RFC 4960 və SST(Struklaşdırılmış Axın Daşıması)-da elan edilən SCTP (Axın İdarəsini Daşıma Protokolu) –dir. Bu protokollar əlaqəli axın qruplarının üstünlüklərini əldə etmək üçün soket API-nı biraz dəyişdirilməlidir və həmçinin əlaqə yönlü və əlaqəsiz trafikin və hətta birdən çox şəbəkə yolunun bir qarışığı kimi özəllikləri dəstəkləyir. Müvəffəqiyyətli olub olmadıqlarını zaman göstərəcək. 

Soket proqramlamaya bir misal: İnternet Fayl Serveri

Şəkil 1 də real soket çağırışını yerinə yetirən klent və server kodunu gözdən keçirək. Burada çox primitiv bir internet fayl serverinin yanında bunu istifadə edən bir klent var.Kodun bir çox limitləri vardır,ancaq prinsib olaraq server kodu internetlə əlaqəli hərhansı bir UNİX ƏS-də kompaylr edilə bilər və işlədilə bilər.

Klient kodu dünyanın hərhansı bir UNİX maşınında kompaylr edilib işlədilə bilər. Klient kodu serverin maşından əlçatımı olan hər hansı bir faylı almaq üçün uyğun parametrlərlə icra edilə bilir. Fayl təbii ki, bir fayla yönləndirilə bilər.Əvvəlcə serverin koduna baxaq. Bəzi standart başlıqları əlavə edərək başlayır, bunların son 3 ü internet ilə əlaqəli təməl elanları və verilənlərin strukturunu saxlayır. Sonrasında SERVER PORT-un 12345 olaraq elan edilməsi gəlir. Bu rəqəm təxmini seçildi. 1024-65535 arasındakı hərhansı portu başqa proseslər tərəfindən istifadə edilmirsə, götürmək olar. 1023 den aşağı portlar isə üstünlük təşkil edir. Serverdəki sonrakı iki sətr lazım olan 2 sabiti təyin edir. İlki fayl transferi üçün istifadə olunan bayt cinsindən ölçünü bildirir.İkincisi varışda əlavə olanları atılmadan neçə gözləyən əlaqənin ediləbiləcəyini təyin edir.

Klient kodu

/*Bu səhifə server proqramından bir fayl istəyəbiləcək bir klient proqramı saxlayır. bir sonrakı səhifədə. Server bütün faylı göndərərək cavab verir. */ #include <sys/types.h>  #include <sys/socket.h> #include <netinet/in.h>  #include <netdb.h> #define SERVER PORT 12345 /* təqribi, ancaq klient və server qəbul edilməli. */ #define BUF SIZE 4096 /* blok transfer ölçüsü.*/ int main(int argc, char **argv) { int c, s, bytes; char buf[BUF SIZE]; /* gələn fayl üçün bufer */ struct hostent *h; /* server haqqında məlumat*/ struct sockaddr in channel; /* İP adresləri saxlayır. */  if (argc != 3) fatal("Usage: client server-name file-name"); h = gethostbyname(argv[1]); /* hostun İP adresini axtarır. */ if (!h) fatal("gethostbyname failed"); s = socket(PF INET, SOCK STREAM, IPPROTO TCP); if (s <0) fatal("socket"); memset(&channel, 0, sizeof(channel)); channel.sin family= AF INET; memcpy(&channel.sin addr.s addr, h->h addr, h->h length); channel.sin port= htons(SERVER PORT);  c = connect(s, (struct sockaddr *) &channel, sizeof(channel)); if (c < 0) fatal("connect failed");  /* Əlaqə yaradıldı. Sonuda 0 bayt olan fayl adı göndərildi. */ write(s, argv[2], strlen(argv[2])+1); /* Faylı alıb standart çıxışa ver. */  while (1) {  bytes = read(s, buf, BUF SIZE); /* soketdən oxu.*/ if (bytes <= 0) exit(0); /* faylın sonuna bax .*/ write(1, buf, bytes); /*standart çıxışa yaz. */ } } fatal(char *string)  {  printf("%s\n", string);  exit(1);  } 

Server kodu 

#include <sys/types.h> /* Server kodudur. */ #include <sys/fcntl.h>  #include <sys/socket.h>  #include <netinet/in.h>  #include <netdb.h>  #define SERVER PORT 12345 /* təqribi, amma klient və sever razı olmalıdır.*/  #define BUF SIZE 4096 /* blok transfer ölçüsü */  #define QUEUE SIZE 10  int main(int argc, char *argv[]) { int s, b, l, fd, sa, bytes, on = 1; char buf[BUF SIZE]; /* gedən fayl üçün bufer */ struct sockaddr in channel; /* İP adresləri saxlayır. */  /* Soketə qoşulmaq üçün adres strukturu yaradır. */ memset(&channel, 0, sizeof(channel)); /* 0 kanalı */ channel.sin family = AF INET; channel.sin addr.s addr = htonl(INADDR ANY); channel.sin port = htons(SERVER PORT); /* Passiv açılma . Əlaqəni gözləyir. */ s = socket(AF INET, SOCK STREAM, IPPROTO TCP); /* soket yaradır. */ if (s < 0) fatal("socket failed"); setsockopt(s, SOL SOCKET, SO REUSEADDR, (char *) &on, sizeof(on));  b = bind(s, (struct sockaddr *) &channel, sizeof(channel)); if (b < 0) fatal("bind failed"); l = listen(s, QUEUE SIZE); /* sıranın ölçüsünü müəyyən edir. */ if (l < 0) fatal("listen failed"); /* Soket artıq quraşdırılıb və qoşuludur. Əlaqəni gözləyin və icra edin. */ while (1) { sa = accept(s, 0, 0); /* Qoşulma istəkləri üçün blok. */ if (sa < 0) fatal("accept failed"); read(sa, buf, BUF SIZE); /* Soketdən fayl adını oxuyur. */ /* Faylı alıb geri gətirir. */ fd = open(buf, O RDONLY); /* göndəriləcək faylı geri aç. */ if (fd < 0) fatal("open failed"); while (1) { bytes = read(fd, buf, BUF SIZE); /* fayldan oxu */ if (bytes <= 0) break; /* faylın sonuna bax .*/ write(sa, buf, bytes); /* baytları soketə yaz. */ } close(fd); /* faylı bağla */ close(sa); /* əlaqəni kəs. */  } } 

Lokal dəyişənləri elan etdikdən sonra server kodu başlayır. Serverin İP adresini tutacaq bir verilənlər strukturu inisial edərək başlayır.Bu verilənlər strukturu serverin soketinə qoşulacaq. Memset çağırışı verilənlər strukturunu  0 a quraşdırır. Bunu təqib edən üç təyinat sahələrindən üçünü doldurur. Bunların sonuncusu, serverin portunu saxlayır. Daha sonra server bir soket yaradır və səhvləri yoxlayır (s<0 ilə göstərilir). Setsockopt çağırışı serverin fasiləsiz işləyəbilməsi üçün prtun təkrar istifadə edilməsinə icazə verməsi üçün lazımdır.İndi İP adresi soketə qoşulub və qoşulma çağırışının müvəffəqiyətli olub-olmadığını görmək üçün yoxlama reallaşdırılır.İnisializasiyanın son addımı serverin gələn çağırışları qəbul etmə istəyini elan etmək və server hələ də mövcud olanı işləyərkən yeni istəklərin gəlməsi vəziyyətində sistemə QUEUE SİZE qədər tutukmasını demək üçün listen çağırışı istifadə olunur. Sıra doludursa və əlavə istək gələrsə, bunlar atılır.

Bu nöqtədə serverə əsas dövrə girir. Onu saxlamanın tək yolu xaricdən məhv  etməkdir. Accept bloku bəzi klientlər onunla əlaqə yaratmağa çalışana qədər serveri əngəlləyir. Accept çağırışı müvəffəqiyətli olarsa, o oxuma yazma üçün istifadə olunan soket deskriptoru qaytarır.Əlaqə yaradıldıqdan sonra server fayl adını oxuyur. Əgər ad hələ möcud deyilsə, server blokları  onu gözləyir. Fayl adını aldıqdan sonra server faylı açar və dövrü olaraq fayldan blokları oxuyur və bütün fayl kopyalanana qədər soketə yazan bir dövrə girər.Daha sonra server fayl və əlaqəni bağlayır və bir sonrakı əlaqənin göstərilməsini gözləyir. Bu dövrü sonsuza qədər dəvam edir.

İndi isə klient koduna baxaq. Necə işlədiyini anlamaq üçün necə çağrıldığını bilmək lazımdır. Bunu client deyə çağıraq:

client flits.cs.vu.nl /usr/tom/filename >f

Bu çağırış ancaq server flits.cs.vu.nl –də işləyirsə və /usr/tom/filename faylı varsa və server ona oxuma keçidi verirsə ,işləyir. Çağırış müvəffəqiyyətli olarsa, fayl internet üzərindən transfer olunur və f-ə yazılır və arxasından klient programı çıxır. Server bir transferdən sonra dəvam etdiyindən, klient başqa faylları almaq üçün təkrar təkrar başlaya bilər. Klient kodu bəzi əlavələr və mənimsəmələrlə başlayır. İcra etmə düzgün sayda arqumentlə çağrılmış olub olmadığını yoxlayaraq başlayır(argc=3 proqramın adı üstəgəl iki arqument ). Argv[1] serverin adını saxlayır və gethostbyname tərəfindən bir İP adresinə çevrildiyini yaddan çıxarmayın. Bu funksiya adı axtarmaq üçün DNS istifadə edir.

Daha sonra bir soket yaradılır və inisializasiya olunur. Bundan sonra klient connect istifadə edərək serverə bir TCP əlaqəsi qurmağa çalışır. Server adlandırılmış maşında işləyirsə və SERVER_PORT-a qoşuludursa və boşda ya da listen sırasında yer varsa, əlaqə qurulacaqdır. Əlaqəni istifadə edərək klient soketin üzərinə yazaraq faylın adını göndərir. Göndərilən bayt sayı ada son verilən 0 baytın serverə adının harada sona çatdığını bildirməsi üçün göndərilməsi lazım gəldiyindən, düzgün adın birindən daha böyükdür. İndi isə klient dövrə girir, faylı soketdən blok-blok oxuyaraq standart çıxışa kopyalayır. Bittikdə, sadəcə çıxır. Fatal proseduru bir xəta mesajı çap edir və çıxır. Server və klient ayrı-ayrı kompaylr edildiyindən və normalda fərqli kompüterlərdə işlədiyi üçün fatal kodunu paylaşmazlar.

Xarici keçidlər

Computer Networks, 5th Edition, paraqraf 6.1.3-6.1.4 səh 500-507

nəqliyyat, xidməti, məqaləni, vikiləşdirmək, lazımdır, lütfən, məqaləni, ümumvikipediya, redaktə, qaydalarına, uyğun, şəkildə, tərtib, edin, berkeley, soketləri, soketlər, əvvəl, 1983, berkeley, unix, program, paylayıcısının, parçası, olaraq, tanıdıldı, onlar,. Bu meqaleni vikilesdirmek lazimdir Lutfen meqaleni umumvikipediya ve redakte qaydalarina uygun sekilde tertib edin Berkeley soketleri Soketler ilk evvel 1983 de Berkeley UNIX 4 2 BSD program paylayicisinin bir parcasi olaraq tanidildi Onlar tez bir zamanda populyar oldular Primitivler hal hazirda bir cox emeliyyat sistemleri terefinden ozellikle UNIX esasli sistemlerde internet proqramlasdirma ucun en cox istifade olunandir ve Windows ucun winsock adli bir soket terzi API vardir Sekil1 Primitivler Sekil 2 de listlenmisdir Kobudca desek ilk misalimizin modelini teqib edirler ancaq daha cox ozellik ve ceviklik verir Sekil 2 TCP ucun soket primitivleri Primitiv MenasiSOCKET Yeni bir elaqe son noqtesi yaradir BIND Lokal bir adresi bir soketle elaqelendirin LISTEN Elaqeleri qebul etme isteyini elan edir sira olcusu verACCEPT Gelen elaqeni passiv olaraq qururCONNECT Aktiv olaraq bir elaqe qurmaga calisirSEND Elaqe uzerinden bezi melumatlar gonderirRECEIVE Elaqeden bezi melumatlar qebul edirCLOSE Elaqeni azad edirCedveldeki ilk dord primitiv sirayla serverler terefinden icra olunur SOCKET primitiv obyekti yeni son noqte yaradir ve onun ucun dasima obyektinin icinde cedvel sahesi ayirir Cagiris parametrleri istifade olunacaq adresleme formatini arzulanan servis novunu mes guvenilir bayt axisi ve protokolu mueyyen edir Muveffeqiyetli bir SOCKET cagirisi bir fayldaki OPEN cagirisi kimi muveffeqiyyetli cagirilislarda istifade olunacaq adi bir fayl deskriptoru geri qaytarir Yeni yaradilan soketlerin sebeke adresleri yoxdur Bunlar BIND primitivini istifade ederek teyin edilir Bir server bir adresi bir sokete bagladiqdan sonra uzaqdaki klentler ona qosula biler SOCKET cagrisinin bibasa bir adres yaratmasini istememesinin sebebi bezi prosesslerin adreslerini onemsediyi diger bir deyisle illerce eyni adresi istifade etmeleri ve herkesin bu adresi bilmesidir digerlerinin ise etmediyi bir veziyyetdir Sonrasinda bir nece klentin eyni zamanda qosulmaga cehd etmesi veziyyetinde gelen cagrislari siraya alan LISTEN cagrisidir Ilk misalimizda LISTEN in eksine soket modelinde LISTEN bir bloklama cagirisi deyil Gelen bir qosulmani gozlemekden el cekmek ucun server ACCEPT primitivini icra edir Qosulma isteyen bir bolum geldiyinde dasima obyekti orjinaliyla eyni ozelliklere sahib yeni bir soket yaradir ve bunun ucun bir fayl deskriptor qaytarir Server daha sonra yeni soketdeki qosulmani icra etmek ve orjinal soketdeki bir sonraki qosulmani gozlemek uzere geri qayitmaq ecen bir prosesi ve ya tredi cixarda biler ACCEPT fayllar ucun oldugu kimi standart bir sekilde oxuma ve yazma ucun istifade olna bilen bir fayl deskriptoru qaytarir Indi musteri terefine baxaq Burada da ilk evvel bir soket SOCKET primitiv istifade edilerek yaradilmalidir amma istifade olunan adres server ucun onemli olmadigindan BIND lazimli deyildir CONNECT cagiriscini Blokluyur ve elaqe prosesini aktiv basladir Proses tamamlandiqda klent prosesi engeli qalxir ve elaqe qurulur Artiq her iki teref de full duplex elaqe uzerinden melumat gondermek ve almaq ucun SEND ve RECEIVE ozelliyini istifade edilebiler Standart UNIX READ ve WRITE sistem cagirislari SEN ve RECEIVE ozel seceneklerinden hecbirinin lazim olmamasi veziyyetinde istifade edile biler Soketlerle elaqe serbest buraxilmasi simmetrikdir Her iki teref bir CLOSE primitivini icra olunduqda elaqe serbest qalir Soket API sinin gucu bir proqram terefinden diger dasima xidmetleri ucun istifade edile biler Meselen soketler elaqesiz bir dasima xidmeti ile istifade oluna biler Soket API nin gucu bir proqram terefinden diger dasima xidmetleri ucun istifade oluna biler Meselen soketler elaqesiz bir dasima xidmeti ile istifade edile biler Bu veziyyetde CONNECT uzaq dasima cutunun adresini qurasdirar ve SEND ve RECEIVE uzaq cutden gelen ve uzaqdaki cutlerden dataqramlari gonderib almaga yariyir Soketler hemcinin bir bayt axisi yerine melumat axisi techiz eden ve tixaniqliq idaresi olan ve ya olmayan bir dasima protokollari ile istifade edile biler Meselen DCCP Datagram Congestion Controlled Protocol tixaniqliq idaresi olan UDP versiyasidir Bununla birlikde soketler dasima interfeysi uzerindeki son sozu olmayacaqdir Meselen proqramlar esasen eyni serverden bir nece obyekt isteyen Web brauzer kimi bir qrup elaqeli axinla isleyir Soketlerle en tebii uyumu aplikasiya proqramlari ucun obyekt basina bir axin istifade olunmasidir Bu struktur tixaniqliq kontrolu her bir axin ucun ayri olaraq tetbiq olunmasi menasina gelir qrup arasinda deyil Elaqeli protokol qruplarini aplikasiya ucun daha effektiv ve besit bir sekilde destekleyen daha yeni protokollar ve interfeysler dizayn edilmisdir Iki misal RFC 4960 ve SST Struklasdirilmis Axin Dasimasi da elan edilen SCTP Axin Idaresini Dasima Protokolu dir Bu protokollar elaqeli axin qruplarinin ustunluklerini elde etmek ucun soket API ni biraz deyisdirilmelidir ve hemcinin elaqe yonlu ve elaqesiz trafikin ve hetta birden cox sebeke yolunun bir qarisigi kimi ozellikleri destekleyir Muveffeqiyyetli olub olmadiqlarini zaman gosterecek Mundericat 1 Soket proqramlamaya bir misal Internet Fayl Serveri 1 1 Klient kodu 1 2 Server kodu 2 Xarici kecidlerSoket proqramlamaya bir misal Internet Fayl Serveri RedakteSekil 1 de real soket cagirisini yerine yetiren klent ve server kodunu gozden kecirek Burada cox primitiv bir internet fayl serverinin yaninda bunu istifade eden bir klent var Kodun bir cox limitleri vardir ancaq prinsib olaraq server kodu internetle elaqeli herhansi bir UNIX ES de kompaylr edile biler ve isledile biler Klient kodu dunyanin herhansi bir UNIX masininda kompaylr edilib isledile biler Klient kodu serverin masindan elcatimi olan her hansi bir fayli almaq ucun uygun parametrlerle icra edile bilir Fayl tebii ki bir fayla yonlendirile biler Evvelce serverin koduna baxaq Bezi standart basliqlari elave ederek baslayir bunlarin son 3 u internet ile elaqeli temel elanlari ve verilenlerin strukturunu saxlayir Sonrasinda SERVER PORT un 12345 olaraq elan edilmesi gelir Bu reqem texmini secildi 1024 65535 arasindaki herhansi portu basqa prosesler terefinden istifade edilmirse goturmek olar 1023 den asagi portlar ise ustunluk teskil edir Serverdeki sonraki iki setr lazim olan 2 sabiti teyin edir Ilki fayl transferi ucun istifade olunan bayt cinsinden olcunu bildirir Ikincisi varisda elave olanlari atilmadan nece gozleyen elaqenin edilebileceyini teyin edir Klient kodu Redakte Bu sehife server proqramindan bir fayl isteyebilecek bir klient proqrami saxlayir bir sonraki sehifede Server butun fayli gondererek cavab verir include lt sys types h gt include lt sys socket h gt include lt netinet in h gt include lt netdb h gt define SERVER PORT 12345 teqribi ancaq klient ve server qebul edilmeli define BUF SIZE 4096 blok transfer olcusu int main int argc char argv int c s bytes char buf BUF SIZE gelen fayl ucun bufer struct hostent h server haqqinda melumat struct sockaddr in channel IP adresleri saxlayir if argc 3 fatal Usage client server name file name h gethostbyname argv 1 hostun IP adresini axtarir if h fatal gethostbyname failed s socket PF INET SOCK STREAM IPPROTO TCP if s lt 0 fatal socket memset amp channel 0 sizeof channel channel sin family AF INET memcpy amp channel sin addr s addr h gt h addr h gt h length channel sin port htons SERVER PORT c connect s struct sockaddr amp channel sizeof channel if c lt 0 fatal connect failed Elaqe yaradildi Sonuda 0 bayt olan fayl adi gonderildi write s argv 2 strlen argv 2 1 Fayli alib standart cixisa ver while 1 bytes read s buf BUF SIZE soketden oxu if bytes lt 0 exit 0 faylin sonuna bax write 1 buf bytes standart cixisa yaz fatal char string printf s n string exit 1 Server kodu Redakte include lt sys types h gt Server kodudur include lt sys fcntl h gt include lt sys socket h gt include lt netinet in h gt include lt netdb h gt define SERVER PORT 12345 teqribi amma klient ve sever razi olmalidir define BUF SIZE 4096 blok transfer olcusu define QUEUE SIZE 10 int main int argc char argv int s b l fd sa bytes on 1 char buf BUF SIZE geden fayl ucun bufer struct sockaddr in channel IP adresleri saxlayir Sokete qosulmaq ucun adres strukturu yaradir memset amp channel 0 sizeof channel 0 kanali channel sin family AF INET channel sin addr s addr htonl INADDR ANY channel sin port htons SERVER PORT Passiv acilma Elaqeni gozleyir s socket AF INET SOCK STREAM IPPROTO TCP soket yaradir if s lt 0 fatal socket failed setsockopt s SOL SOCKET SO REUSEADDR char amp on sizeof on b bind s struct sockaddr amp channel sizeof channel if b lt 0 fatal bind failed l listen s QUEUE SIZE siranin olcusunu mueyyen edir if l lt 0 fatal listen failed Soket artiq qurasdirilib ve qosuludur Elaqeni gozleyin ve icra edin while 1 sa accept s 0 0 Qosulma istekleri ucun blok if sa lt 0 fatal accept failed read sa buf BUF SIZE Soketden fayl adini oxuyur Fayli alib geri getirir fd open buf O RDONLY gonderilecek fayli geri ac if fd lt 0 fatal open failed while 1 bytes read fd buf BUF SIZE fayldan oxu if bytes lt 0 break faylin sonuna bax write sa buf bytes baytlari sokete yaz close fd fayli bagla close sa elaqeni kes Lokal deyisenleri elan etdikden sonra server kodu baslayir Serverin IP adresini tutacaq bir verilenler strukturu inisial ederek baslayir Bu verilenler strukturu serverin soketine qosulacaq Memset cagirisi verilenler strukturunu 0 a qurasdirir Bunu teqib eden uc teyinat sahelerinden ucunu doldurur Bunlarin sonuncusu serverin portunu saxlayir Daha sonra server bir soket yaradir ve sehvleri yoxlayir s lt 0 ile gosterilir Setsockopt cagirisi serverin fasilesiz isleyebilmesi ucun prtun tekrar istifade edilmesine icaze vermesi ucun lazimdir Indi IP adresi sokete qosulub ve qosulma cagirisinin muveffeqiyetli olub olmadigini gormek ucun yoxlama reallasdirilir Inisializasiyanin son addimi serverin gelen cagirislari qebul etme isteyini elan etmek ve server hele de movcud olani isleyerken yeni isteklerin gelmesi veziyyetinde sisteme QUEUE SIZE qeder tutukmasini demek ucun listen cagirisi istifade olunur Sira doludursa ve elave istek gelerse bunlar atilir Bu noqtede servere esas dovre girir Onu saxlamanin tek yolu xaricden mehv etmekdir Accept bloku bezi klientler onunla elaqe yaratmaga calisana qeder serveri engelleyir Accept cagirisi muveffeqiyetli olarsa o oxuma yazma ucun istifade olunan soket deskriptoru qaytarir Elaqe yaradildiqdan sonra server fayl adini oxuyur Eger ad hele mocud deyilse server bloklari onu gozleyir Fayl adini aldiqdan sonra server fayli acar ve dovru olaraq fayldan bloklari oxuyur ve butun fayl kopyalanana qeder sokete yazan bir dovre girer Daha sonra server fayl ve elaqeni baglayir ve bir sonraki elaqenin gosterilmesini gozleyir Bu dovru sonsuza qeder devam edir Indi ise klient koduna baxaq Nece islediyini anlamaq ucun nece cagrildigini bilmek lazimdir Bunu client deye cagiraq client flits cs vu nl usr tom filename gt fBu cagiris ancaq server flits cs vu nl de isleyirse ve usr tom filename fayli varsa ve server ona oxuma kecidi verirse isleyir Cagiris muveffeqiyyetli olarsa fayl internet uzerinden transfer olunur ve f e yazilir ve arxasindan klient programi cixir Server bir transferden sonra devam etdiyinden klient basqa fayllari almaq ucun tekrar tekrar baslaya biler Klient kodu bezi elaveler ve menimsemelerle baslayir Icra etme duzgun sayda arqumentle cagrilmis olub olmadigini yoxlayaraq baslayir argc 3 proqramin adi ustegel iki arqument Argv 1 serverin adini saxlayir ve gethostbyname terefinden bir IP adresine cevrildiyini yaddan cixarmayin Bu funksiya adi axtarmaq ucun DNS istifade edir Daha sonra bir soket yaradilir ve inisializasiya olunur Bundan sonra klient connect istifade ederek servere bir TCP elaqesi qurmaga calisir Server adlandirilmis masinda isleyirse ve SERVER PORT a qosuludursa ve bosda ya da listen sirasinda yer varsa elaqe qurulacaqdir Elaqeni istifade ederek klient soketin uzerine yazaraq faylin adini gonderir Gonderilen bayt sayi ada son verilen 0 baytin servere adinin harada sona catdigini bildirmesi ucun gonderilmesi lazim geldiyinden duzgun adin birinden daha boyukdur Indi ise klient dovre girir fayli soketden blok blok oxuyaraq standart cixisa kopyalayir Bittikde sadece cixir Fatal proseduru bir xeta mesaji cap edir ve cixir Server ve klient ayri ayri kompaylr edildiyinden ve normalda ferqli komputerlerde islediyi ucun fatal kodunu paylasmazlar Xarici kecidler RedakteComputer Networks 5th Edition paraqraf 6 1 3 6 1 4 seh 500 507Menbe https az wikipedia org w index php title Neqliyyat xidmeti amp oldid 4367866, wikipedia, oxu, kitab, kitabxana, axtar, tap, hersey,

ne axtarsan burda

, en yaxsi meqale sayti, meqaleler, kitablar, oyrenmek, wiki, bilgi, tarix, seks, porno, indir, yukle, sex, azeri sex, azeri, seks yukle, sex yukle, izle, seks izle, porno izle, mobil seks, telefon ucun, chat, azeri chat, tanisliq, tanishliq, azeri tanishliq, sayt, medeni, medeni saytlar, chatlar, mekan, tanisliq mekani, mekanlari, yüklə, pulsuz, pulsuz yüklə, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, şəkil, muisiqi, mahnı, kino, film, kitab, oyun, oyunlar.