Muokataan sivua Pistoke

Siirry navigaatioon Siirry hakuun
Varoitus: Et ole kirjautunut sisään. IP-osoitteesi näkyy julkisesti kaikille, jos muokkaat. Jos kirjaudut sisään tai luot tunnuksen, muokkauksesi yhdistetään käyttäjänimeesi ja saat paremman käyttökokemuksen.

Kumoaminen voidaan suorittaa. Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputuloksen, ja sen jälkeen julkaise alla näkyvät muutokset.

Nykyinen versio Oma tekstisi
Rivi 1: Rivi 1:
'''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 komennolla [[netstat]].
'''Pistoke''' (engl. '''''socket''''') on [[UNIX]]-järjestelmissä keskeinen tietoliikenneyhteyttä kuvaava ohjelmointirajapinta. Teknisemmin ilmaistuna pistoke on käyttöjärjestelmän tarjoama [[wikipedia:fi:Abstrakti tietotyyppi|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.


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 eli [[IPC]]:stä (engl. ''Inter Process Communication'').
Pistokkeeseen kulkeva verkkoliikenne ohjataan pistokkeen avanneelle [[prosessi]]lle 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. '''''I'''nter '''P'''rocess '''C'''ommunication'') eli [[IPC]]:stä.


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 protokolla, 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.
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==
==Historiaa==
Pistokkeisiin perustuva kommunikointirajapinta on alun perin kehitetty Berkeley Software 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ärjestelmiin tehtiin tämän rajapinnan kanssa jossain määrin yhteensopiva toteutus.
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ä 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.
Nykyisin [[POSIX]] määrittelee kaikille UNIX-järjestelmille yhteisen pistokerajapinnan, joka ei merkittävästi eroa alkuperäisestä Berkeley Sockets -toteutuksesta.


==Esimerkki==
==Valvonta==
Pistokkeet saa [[C]]-kielessä käyttöön seuraavasti missä tahansa POSIX-yhteensopivassa järjestelmässä:
Käytössä olevia pistokkeita (s.o. avoinna olevia yhteyksiä) voi tarkastella [[netstat]] komennolla kaikissa UNIXeissa ja Linuxissa.
<source lang="c">
#include <sys/types.h>
#include <sys/socket.h>
</source>


Uusi käyttämätön pistoke luodaan:
==Esimerkki pistokkeesta Linuxissa==
<source lang="c">
Pistokkeet saa [[C]]-kielessä käyttöön seuraavasti:
int socket(int domain, int type, int protocol);
#incldue <sys/types.h>
</source>
#include <sys/socket.h>


Esimerkki palvelinpistokkeesta
Uusi ''käyttämätön pistoke'' luodaan:
<source lang="c">
int socket(int domain, int type, int protocol);
#include <netinet/in.h>
int pistoke = socket(PF_INET6, SOCK_STREAM, 0)
</source>


Luodaan [[IPv6]]-protokollaa käyttävä TCP-pistoke.
Esim. palvelinpistokkeesta
#include <netinet/in.h>
int pistoke = socket(PF_INET6, SOCK_STREAM, 0)


Pistoke sidotaan (engl. bind) isäntäkoneen johonkin porttiin kutsulla:
Luo [[IPv6]]-protokollaa käyttävän TCP-pistokkeen.
<source lang="c">
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
</source>


ja sitten pistoke merkitään halukkaaksi vastaanottamaan paketteja kutsulla:
Pistoke sidotaan (engl. bind) isäntäkoneen johonkin porttiin seuraavasti:
<source lang="c">
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
int listen(int sockfd, int backlog);
 
</source>
ja sitten pistoke merkitään halukkaaksi vastaanottamaan paketteja:
int listen(int sockfd, int backlog);


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">
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
</source>


<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.
<tt>accept</tt>in palauttama <tt>int</tt>-arvo on samalla mudostetun yhteyden <tt>socketfd</tt>-arvo, jota voi lukea ja johon voi kirjoittaa tavallisen tiedoston tapaan <tt>fread()</tt> ja <tt>fwrite()</tt> -kutsuilla.


Lisätietoja on [[man-sivu]]lla socket(2).
Lisätietoja saa [[man-sivu]]lta <tt>man 2 socket</tt>


== Katso myös ==
== Katso myös ==
* [[netstat]]
* [[netstat]]
* [[netcat]]
* [[netcat]]
[[Luokka:Järjestelmä]]
[[Luokka:Verkko]]
Wikin materiaali on kaikkien vapaasti käytettävissä Creative Commons 3.0 - nimi mainittava -lisenssin alaisuudessa. TEKIJÄNOIKEUDEN ALAISEN MATERIAALIN KÄYTTÄMINEN ILMAN LUPAA ON EHDOTTOMASTI KIELLETTYÄ!

Muokataksesi tätä sivua vastaa alla olevaan kysymykseen (lisätietoja):

Peruuta Muokkausohjeet (avautuu uuteen ikkunaan)
Noudettu kohteesta ”https://www.linux.fi/wiki/Pistoke