Pistoke

Linux.fista
Versio hetkellä 13. helmikuuta 2009 kello 00.15 – tehnyt Ordyh (keskustelu | muokkaukset) (→‎Esimerkki pistokkeesta Linuxissa)
Siirry navigaatioon Siirry hakuun

Pistoke (engl. socket) on UNIX-järjestelmissä keskeinen tietoliikenneyhteyttä kuvaava ohjelmointirajapinta. Teknisemmin ilmaistuna pistoke on käyttöjärjestelmän tarjoama abstraktio. Jokaista UNIX-järjestelmässä kulkevaa tietoliikenneyhteyttä vastaa yksi pistoke käyttöjärjestelmän muistissa. Yhteydet ovat yleensä esim. TCP- tai UDP-yhteyksiä IP:n tai IPv6:n yli.

Pistokkeeseen kulkeva verkkoliikenne ohjataan pistokkeen avanneelle prosessille yleensä porttinumeron perusteella (UNIX domain socketin tapauksessa tiedostonimen perusteella). Pistokkeen ei tarvitse välttämättä kuljettaa TCP/IP-liikennettä, vaan sen protokollaksi voidaan määritellä myös esimerkiksi IPX tai myös UNIX domain socket, jolloin se on yksi muoto paikallisella koneella tapahtuvasta prosessienvälisestä kommunikoinnista (engl. Inter Process Communication) eli IPC:stä.

Pistoke voi olla monessa eri tilassa: se voi olla täysin käyttämötön pistoke, jolla ei ole muita ominaisuuksia kuin valittu protkolla, se voi olla jotakin tiettyä porttia kuunteleva pistoke, joka "synnyttää" uusia pistokkeita kun muut koneet ottavat yheyttä tämän porttiin, tai se voi olla yhdistetty pistoke, jolla on jo tiedossa kummatkin yhteyden ääripäät, ja jonka kautta voi oikeasti kulkea tietoa.

Pistokkeet ovat yhteensopivia C:n standardisyöttö- ja tulostuskirjaston kanssa, stdio.

Historiaa

Pistokkeisiin perustuva kommunikointirajapinta on alunperin kehitetty Berkeley Source Distribution eli BSD UNIX-järjestelmille, ja julkaistu BSD-lisenssin alaisuudessa 4.2BSD:ssa vuonna 1983. Tämän takia toteutus tunnetaan yleisesti nimellä Berkeley Sockets. Myöhemmin mm. Microsoftin Windows järjeslmiin kopoitiin tämä toteutus, ja tämän vuoksi verkko-ohjelmien ohjelmointi Windows-järjestelmissä ei eroa merkittävästi UNIX-järjestelmien käytännöistä. Myöhemmin Windowsille on kirjoitettu oma versio pistokerajapinnasta.

Nykyisin POSIX määrittelee kaikille UNIX-järjestelmille yhteisen pistokerajapinnan, joka ei merkittävästi eroa alkuperäisestä Berkeley Sockets -toteutuksesta.

Valvonta

Käytössä olevia pistokkeita (s.o. avoinna olevia yhteyksiä) voi tarkastella netstat komennolla kaikissa UNIXeissa ja Linuxissa.

Esimerkki pistokkeesta Linuxissa

Pistokkeet saa C-kielessä käyttöön seuraavasti:

#include <sys/types.h>
#include <sys/socket.h>

Uusi käyttämätön pistoke luodaan:

int socket(int domain, int type, int protocol);

Esim. palvelinpistokkeesta

#include <netinet/in.h>
int pistoke = socket(PF_INET6, SOCK_STREAM, 0)

Luo IPv6-protokollaa käyttävän TCP-pistokkeen.

Pistoke sidotaan (engl. bind) isäntäkoneen johonkin porttiin seuraavasti:

int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);

ja sitten pistoke merkitään halukkaaksi vastaanottamaan paketteja:

int listen(int sockfd, int backlog);

Pistokkeesta tulee kuunteleva pistoke.

Tämän jälkeen yhteyksiä voi ottaa vastaan yksitellen accept() kutsulla:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

acceptin palauttama int-arvo on samalla mudostetun yhteyden socketfd-arvo, jota voi lukea ja johon voi kirjoittaa tavallisen tiedoston tapaan fread() ja fwrite() -kutsuilla.

Lisätietoja on man-sivulla socket(2).

Katso myös