Ero sivun ”Pistoke” versioiden välillä
Siirry navigaatioon
Siirry hakuun
alkusektio kokonaan uusiksi ja puppua korjattu
(alkusektio kokonaan uusiksi ja puppua korjattu) |
|||
Rivi 1: | Rivi 1: | ||
'''Pistoke''' (engl. '''''socket''''') on [[UNIX]]-järjestelmissä keskeinen tietoliikenneyhteyttä kuvaava | '''Pistoke''' (engl. '''''socket''''') on [[UNIX]]-järjestelmissä keskeinen tietoliikenneyhteyttä kuvaava käyttöjärjestelmän tarjoama kaksisuuntainen ohjelmointirajapinta, joka mahdollistaa kahden mahdollisesti eri isäntäkoneella olevan [[prosessi]]n välisen kommunikoinnin. Prosessille pistoke näkyy abstraktiona, jota voi lukea ja johon voi kirjoittaa tiedoston tapaan. Käyttäjän näkökulmasta jokaista UNIX-järjestelmässä kulkevaa tietoliikenneyhteyttä ja jokaista palvelinsovellusta vastaa yksi pistoke. Käytössä olevat pistokkeet voi listata <tt>[[netstat]]</tt>-komennolla. | ||
Käyttöjärjestelmä ohjaa pistokkeeseen kuuluvan verkkoliikenteen pistokkeen omistavalle prosessille. Tunnistus tapahtuu porttinumeron perusteella (''UNIX domain socketin'' tapauksessa tiedostonimen perusteella). Pistokkeen ei tarvitse välttämättä kuljettaa TCP/IP-liikennettä, vaan sen alemman tason protokollaksi voidaan valita myös esimerkiksi [[IPX]] tai myös [[UNIX domain socket]], jolloin ei ole kyse verkkoliikenteestä, vaan paikallisella koneella tapahtuvasta prosessienvälisestä kommunikoinnista (engl. '''''I'''nter '''P'''rocess '''C'''ommunication'') eli [[IPC]]:stä. | |||
Pistoke | Pistokkeella on useita mahdollisia tiloja, ja kaikkia pistokkeita ei voi välttämättä lukea. Pistoke voi olla täysin ''käyttämötön pistoke'', jolla ei ole muita ominaisuuksia kuin valittu protkolla, tai se voi olla jotakin tiettyä porttia ''kuunteleva pistoke'', joka "synnyttää" uusia pistokkeita tarvittaessa kun muut prosessit ottavat yheyttä tämän porttiin. Vain ''yhdistetyn pistokkeen'', jolla on jo tiedossa kummatkin yhteyden ääripäät, kautta voi oikeasti kulkea dataa. | ||
==Historiaa== | ==Historiaa== | ||
Pistokkeisiin perustuva kommunikointirajapinta on alunperin kehitetty Berkeley Source Distribution eli [[BSD]] UNIX-järjestelmille, ja julkaistu [[BSD-lisenssi]]n alaisuudessa 4.2BSD:ssa vuonna '''1983'''. Tämän takia toteutus tunnetaan yleisesti nimellä '''Berkeley Sockets'''. Myöhemmin mm. Microsoftin Windows järjeslmiin kopoitiin | Pistokkeisiin perustuva kommunikointirajapinta on alunperin kehitetty Berkeley Source Distribution eli [[BSD]] UNIX-järjestelmille, ja julkaistu [[BSD-lisenssi]]n 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än rajapinnan kanssa jossain määrin yhteensopiva toteutus. | ||
Nykyisin [[POSIX]] määrittelee kaikille UNIX-järjestelmille yhteisen pistokerajapinnan, joka ei merkittävästi eroa alkuperäisestä Berkeley Sockets -toteutuksesta. | Nykyisin [[POSIX]] määrittelee kaikille UNIX-järjestelmille yhteisen pistokerajapinnan, joka ei merkittävästi eroa alkuperäisestä Berkeley Sockets -toteutuksesta. | ||
==Esimerkki== | |||
Pistokkeet saa [[C]]-kielessä käyttöön seuraavasti missä tahansa POSIX-yhteensopivassa järjestelmässä: | |||
==Esimerkki | |||
Pistokkeet saa [[C]]-kielessä käyttöön seuraavasti: | |||
<source lang="c"> | <source lang="c"> | ||
#include <sys/types.h> | #include <sys/types.h> | ||
Rivi 35: | Rivi 30: | ||
Luo [[IPv6]]-protokollaa käyttävän TCP-pistokkeen. | Luo [[IPv6]]-protokollaa käyttävän TCP-pistokkeen. | ||
Pistoke sidotaan (engl. bind) isäntäkoneen johonkin porttiin | Pistoke sidotaan (engl. bind) isäntäkoneen johonkin porttiin kutsulla: | ||
<source lang="c"> | <source lang="c"> | ||
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen); | int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen); | ||
</source> | </source> | ||
ja sitten pistoke merkitään halukkaaksi vastaanottamaan paketteja: | ja sitten pistoke merkitään halukkaaksi vastaanottamaan paketteja kutsulla: | ||
<source lang="c"> | <source lang="c"> | ||
int listen(int sockfd, int backlog); | int listen(int sockfd, int backlog); | ||
Rivi 47: | Rivi 42: | ||
Pistokkeesta tulee ''kuunteleva pistoke''. | Pistokkeesta tulee ''kuunteleva pistoke''. | ||
Tämän jälkeen yhteyksiä voi ottaa vastaan yksitellen <tt>accept()</tt> kutsulla: | Tämän jälkeen yhteyksiä voi ottaa vastaan yksitellen <tt>accept()</tt>-kutsulla: | ||
<source lang="c"> | <source lang="c"> | ||
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); | int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); | ||
</source> | </source> | ||
<tt>accept</tt>in palauttama <tt>int</tt>-arvo on samalla mudostetun yhteyden <tt>socketfd</tt>-arvo, jota voi lukea ja johon voi kirjoittaa | <tt>accept</tt>in palauttama <tt>int</tt>-arvo on samalla mudostetun yhteyden <tt>socketfd</tt>-arvo, jota voi lukea <tt>recv()</tt>-kutsulla ja johon voi kirjoittaa <tt>send()</tt>-kutsulla. Komentojen käyttö on samanlaista kuin tiedostojen luku ja kirjoitus <tt>read()</tt> ja <tt>write()</tt>-kutsuilla. | ||
Lisätietoja on [[man-sivu]]lla socket(2). | Lisätietoja on [[man-sivu]]lla socket(2). |