Professional Documents
Culture Documents
SO Unixsockets
SO Unixsockets
Prishtinë, 2022
Interprocess communication using unix sockets
Përmbajtja
I. Përshkrimi i problemit 3
III. Implementimi 8
Referencat 13
2
Interprocess communication using unix sockets
I. Përshkrimi i problemit
Getting Started with Unix Domain Sockets
Socket-at sigurojnë një mjet komunikimi në mes të proceseve, pra një mënyrë për të shkëmbyer
të dhëna. Mënyra se si funksionon zakonisht komunikimi përmes socket-ave është se procesi A
ka socket-in X dhe processi B ka socket-in Y dhe këta dy socket-a janë të lidhur. Secili proces
mund t'a përdorë socket-in e tij për të marrë të dhëna nga procesi tjetër ose për të dërguar të
dhëna te procesi tjetër. Socket-at mund të përshkruhen si një kanal komunikimi ku të dy palët
mund të lexojnë dhe shkruajnë (Figura 1).
3
Interprocess communication using unix sockets
Shënim:
Çdo socket ka dy atribute të rëndësishme: një domain dhe një lloj komunikimi. Ka dy lloje
kryesore: stream dhe datagram. Në projekt do të bazohemi në streaming type.
Server Process
Ky procss lidh një socket me një lokacion të njohur dhe pranon kërkersat hyrëse të lidhjes nga
klientat. Për çdo request connection që merret, krijohet një socket i ri që përdoret për
komunikim me peer socket (peer socket = socket-i në anën e fundme të lidhjes, në këtë rast
socket-i i krijuar nga një proces-klient).
1. Serveri krijon një socket të ri duke përdorur thirrjen sistemore socket(). Kjo thirrje kthen
një file descriptor që mund të përdoret për të ju referuar socket-it.
2. Serveri përdor thirrje sistemore bind() për të lidhur socketin në një adresë, kështu që
klienti mundet të konektohet me serverin.
3. Serveri thërret thirrjen sistemore listen() për të bërë socketin pasive listening.
4. Serveri thërret thirrjen sistemore accept() për t'i pranuar lidhjet hyrëse. Kjo thirrje është
bllokuese deri sa vjen një kërkesë për lidhje me serverin. Duhet pasur parasyshë se ky
funksion na jep error nëse thirret para funksionit listen(). Kjo thirrje sistemore krijon një
socket të ri dhe lidhet me socketin peer dhe kthen një file descriptor të lidhur me të. Pra
nëse dëshirojmë të komunikojmë me socketin e peer-it duhet të përdorim file
descriptorin e kthyer nga accept().
5. Pas kësaj, thirrja sistemore read() dhe write() mund të përdoret për komunikim me peer
socket (përshembull, për të komunikuar me klientin).
6. Së fundmi, kur serveri e kryen punën me socket, lidhjen mes socketave duhet t'a
mbyllim me thirrjen sistemore close().
4
Interprocess communication using unix sockets
Client Process
Ky process lidh socketin e tij me një socket pasiv (server socket) pas së cilës është i lirë të
komunikojë me peer socket. T'a vërejmë dallimin mes passive socket dhe peer socket. I pari
krijohet duket thirrur socket() funksionin, ndërsa i dyti kthehet me thirrjen accept() (Figura 3).
1. Processi krijon një socket të ri përmes thirrjes socket(), e cila kthen një file descriptor që
përdoret për tiu referuar socketit.
2. Klienti thërret thirrjen sistemore connect(), e cila e lidh socketin e klientit me socketin
pasiv të serverit. Thirrja sistemore connect() duhet të thirret pasi të thirret listen() në
socketin e serverit, përndryshe në procese do ketë error.
5
Interprocess communication using unix sockets
6
Interprocess communication using unix sockets
Për t'a dizajnuar programin e kërkuar, IPC me anë të socketave është përdorur text editor-i
VSCode, gjuha programuese C dhe sistemi operativ Ubuntu-Linux.
7
Interprocess communication using unix sockets
III. Implementimi
Për punimin e këtij projekti ne kemi punuar me VS Code [3], varësisht nga pëlqimi juaj mund të
përdoret ndonjë editor tjetër i cili mund të kryej punë por meqenëse është më i përdorshëm
VSCode atëherë ne kemi vazhduar me të. Krijojmë një folder të ri që punën e këtij projekti t'a
kemi më lehtë të qasshme. Hapim terminalin dhe shënojmë komandën: mkdir ipcSockets, për
krijimin e një direktoriumi të ri:
Pastaj krijojmë një file me emër sipas dëshires, përshembull ne kemi vendosur emrin
unixclient.c, pra prapashtesa duhet të jetë me .c pasi që do t'a punojmë me gjuhën
programuese C.
Në fajllin e krijuar do t'i thërrasim libraritë e nevojshme që të kemi mundësi të implementojmë
kodin e klientit në rregull. Shtojmë libraritë si në foton më poshtë:
8
Interprocess communication using unix sockets
Pas librarive do t'a shënojmë kodin i cili do t'a krijoj socket-in e ri me argumentet e duhura.
Pastaj krijojmë lidhjen me serverin, konfigurojmë adresën dhe shfaqjen e mesazhit në rast errori.
Në fund shkruajmë kodin i cili do të shfaq në server atë se qfarë shënojmë ne dhe mbylljen e
socket-it.
9
Interprocess communication using unix sockets
Kështu përfundojmë pjesën e klientit, dhe do vazhdojmë me pjesën e serverit e cila është paksa
më e gjatë sesa e klientit por megjithatë lehtë e kuptueshme.
Sikurse për klientin fillojmë duke krijuar një fajll i cili emërohet unixserver.c, dhe bëjmë thirrjen
e librarive pothuajse të ngjashme, e poashtu edhe krijimi i socketit.
Pjesa që dallon është si më poshtë dhe vazhdon:
10
Interprocess communication using unix sockets
Pastaj vazhdojmë me pjesën tjetër ku bëjmë lidhjen e socket-it me adresën (Figura 10):
Në fund shohim pjesën e transferimit të të dhënave dhe mbylljen e serverit, po ashtu edhe
pjesën se çfarë të ndodh në rast të paraqitjes së ndonjë errori (Figura 12).
11
Interprocess communication using unix sockets
Figura 12. Marrja e të dhënave të shkëmbyera në buffer dhe printimi i tyre në standard output.
Pasi kemi përfunduar shkruarjen e kodit, e ruajmë file-at dhe i kompajllojmë me komandën e
treguar në figurën më poshtë (Figura 13):
Pasi t'a kemi kompajlluar file-in e klientit vazhdojmë njëjtë edhe për serverin. Pastaj shënojmë
komandën për ekzekutim, ku së pari ekzekutojmë serverin pastaj klientin, dhe shohim në
figurën më poshtë (Figura 14):
Njëjtë ekzekutojmë edhe klientin, dhe pastaj fillojmë të shënojmë çfarëdo nga klienti dhe do të
na shfaqet edhe në server (Figura 15):
12
Interprocess communication using unix sockets
Referencat
13