Muokataan sivua Pistoke
Siirry navigaatioon
Siirry hakuun
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 [[ | '''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. | ||
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ä. | |||
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 | 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 | 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: | ||
#incldue <sys/types.h> | |||
</ | #include <sys/socket.h> | ||
Uusi ''käyttämätön pistoke'' luodaan: | |||
int socket(int domain, int type, int protocol); | |||
int | |||
Esim. palvelinpistokkeesta | |||
#include <netinet/in.h> | |||
int pistoke = socket(PF_INET6, SOCK_STREAM, 0) | |||
Luo [[IPv6]]-protokollaa käyttävän TCP-pistokkeen. | |||
ja sitten pistoke merkitään halukkaaksi vastaanottamaan paketteja | Pistoke sidotaan (engl. bind) isäntäkoneen johonkin porttiin seuraavasti: | ||
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen); | |||
int listen(int sockfd, int backlog); | |||
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> | Tämän jälkeen yhteyksiä voi ottaa vastaan yksitellen <tt>accept()</tt> kutsulla: | ||
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); | |||
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); | |||
<tt>accept</tt>in palauttama <tt>int</tt>-arvo on samalla mudostetun yhteyden <tt>socketfd</tt>-arvo, jota voi lukea | <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 | Lisätietoja saa [[man-sivu]]lta <tt>man 2 socket</tt> | ||
== Katso myös == | == Katso myös == | ||
* [[netstat]] | * [[netstat]] | ||
* [[netcat]] | * [[netcat]] | ||