Najprej moramo predvideti mehanizem, ki komunikacijo omogoča. To doseµemo s stavkom socket().
Glede naslavljanja vtičnic poznamo pri UNIX več načinov. Najbolj znana sta AF_UNIX in AF_INET. AF_UNIX identificira vtičnice z uporabo poti (pathnames). To obliko uporabljamo predvsem pri medprocesni komunikaciji na istem računalniku. AF_INET pa predvideva uporabo Internetskih naslovov, ki jih predstavljamo v znani obliki ±tirih ±tevilk, ločenih s pikami (na primer 192.9.200.10). Poleg naslova računalnika moramo navesti ±tevilko vrat (port number), kar omogoča uporabo več vtičnic na enem računalniku.Naslednji korak je, da vtičnici damo nek naslov. To doseµemo s funkcijo bind( ) .
Navesti moramo ±e tip vtičnice. Nabolj pogosta tipa sta SOCK_STREAM in SOCK_DGRAM. SOCK_STREAM predvideva prenos podatkov v obliki znakovnih nizov. SOCK_DGRAM nakazuje prenos podatkov v obliki datagramov. Laµja in bolj popularna je prva oblika vtičnic.
Vtičnice tipa SOCK_STREAM omogočajo uvr±čanje prihajajočih zahtevkov za povezavo, kar je nekako analogno telefonskemu čakanju na klic ("call waiting"). Če je "linija zasedena", pač čakamo, da se sprosti. To lahko doseµemo s funkcijo listen( ) ,ki sicer ni nujno potrebna.Ko smo naredili vtičnico, moramo počakati na klic z uporabo funkcije accept( ). To je analogno dvigu telefona, če ta pozvoni. Funkcijo accept uporabljamo v streµnem procesu.
Pri procesu-klijentu je stvar bolj preprosta. S funkcijo socket( ) naredimo vtičnico in se nato s funkcijo connect( ) poveµemo z vičnico streµnega procesa.
Sam pogovor poteka s klici, ki jih poznamo za delo z datotekami. Podobno nato
na koncu tudi povezavo zapremo z znanim klicem close
( ).
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#define NSTRS 3
#define ADDRESS "mysocket"
char *strs[NSTRS] = {
"Prvi niz poslan s streznika na klijent\n",
"Drugi niz poslan s streznika na klijent\n",
"Tretji niz poslan s streznika na klijent\n"
};
main() {
char c;
register int i, s, ns, len;
FILE *fp;
int fromlen;
struct sockaddr_un saun, fsaun;
if ((s = socket (AF_UNIX,SOCK_STREAM, 0)) <0) exit(1);
saun.sun_family = AF_UNIX;
strcpy(saun.sun_path, ADDRESS);
unlink(ADDRESS);
len = sizeof(saun.sun_family) + strlen(saun.sun_path);
if (bind(s, &saun, len) <0) exit(2);
if (listen(s,5) <0) exit(3);
if ((ns = accept(s, &fsaun, &fromlen)) <0 ) exit(4);
fp = fdopen(ns,"r");
for (i=0; i< NSTRS; i++)
send( ns, strs[i], strlen(strs[i]), 0);
for (i=0; i<NSTRS; i++) {
while ((c = fgetc(fp)) != EOF) {
putchar(c);
if (c== '\n') break;
}
}
close (s);
exit(0);
}
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#define NSTRS 3
#define ADDRESS "mysocket"
char *strs[NSTRS] = {
"Prvi niz poslan s klijenta na streznik\n",
"Drugi niz poslan s klijenta na streznik\n",
"Tretji niz poslan s klijenta na streznik\n"
};
main() {
char c;
register int i, s, len;
FILE *fp;
struct sockaddr_un saun;
if ((s = socket (AF_UNIX,SOCK_STREAM, 0)) <0) exit(1);
saun.sun_family = AF_UNIX;
strcpy(saun.sun_path, ADDRESS);
len = sizeof(saun.sun_family) + strlen(saun.sun_path);
if (connect(s, &saun, len) <0) exit(2);
fp = fdopen(s,"r");
for (i=0; i< NSTRS; i++) {
while ((c = fgetc(fp)) != EOF) {
putchar(c);
if (c== '\n') break;
}
}
for (i=0; i< NSTRS; i++)
send (s,strs[i], strlen(strs[i]), 0);
close (s);
exit(0);
}