Ero sivun ”Pistoke” versioiden välillä
(Ak: Uusi sivu: '''Pistoke''' (engl. '''''socket''''') on UNIX-järjestelmissä keskeinen tietoliikenneyhteyttä kuvaava ohjelmointirajapinta. Teknisemmin ilmaistuna pistoke on käyttöjärjestel...) |
p (typo, syntax hilight) |
||
Rivi 17: | Rivi 17: | ||
==Esimerkki pistokkeesta Linuxissa== | ==Esimerkki pistokkeesta Linuxissa== | ||
Pistokkeet saa [[C]]-kielessä käyttöön seuraavasti: | Pistokkeet saa [[C]]-kielessä käyttöön seuraavasti: | ||
<source lang="c"> | |||
#include <sys/types.h> | |||
#include <sys/socket.h> | |||
</source> | |||
Uusi ''käyttämätön pistoke'' luodaan: | Uusi ''käyttämätön pistoke'' luodaan: | ||
<source lang="c"> | |||
int socket(int domain, int type, int protocol); | |||
</source> | |||
Esim. palvelinpistokkeesta | Esim. palvelinpistokkeesta | ||
<source lang="c"> | |||
#include <netinet/in.h> | |||
int pistoke = socket(PF_INET6, SOCK_STREAM, 0) | |||
</source> | |||
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 seuraavasti: | 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); | |||
</source> | |||
ja sitten pistoke merkitään halukkaaksi vastaanottamaan paketteja: | ja sitten pistoke merkitään halukkaaksi vastaanottamaan paketteja: | ||
<source lang="c"> | |||
int listen(int sockfd, int backlog); | |||
</source> | |||
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); | |||
</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 tavallisen tiedoston tapaan <tt>fread()</tt> ja <tt>fwrite()</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. |
Versio 12. helmikuuta 2009 kello 20.36
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 saa man-sivulta man 2 socket