**Berkeley sockets** (**BSD sockets**) on Berkeley Software Distributionissa (BSD) esitelty ohjelmointirajapinta (API) prosessien väliseen kommunikointiin niin sanotuilla *pistokkeilla*. BSD rajapinnasta on tullut *de facto* standardi lähes sellaisenaan, jota kutsutaan myös POSIX-standardissa nimellä **POSIX sockets**.

Rajapinta julkaistiin ensimmäisenä 4.2BSD:ssä.

Windowsin Winsock-rajapinta on toinen vastaavankaltainen. Winsock-rajapinnassa on POSIX-määrittelyn mukaiset toiminnot. Macintosh-alustalla rajapinnan funktioiden nimeäminen on poikennut yleisesti käytetystä. iOS-alustalla rajapinta on merkittävästi erilainen. Muita erilaisia rajapintoja on X/Open Transport Interface (XTI).

Useimmat alustat nykyisin toteuttavat POSIX-määrittelyn mukaisen version verkko-ohjelmointiin.

Toiminnot
---------

Pistoke (engl. *socket*) on rajapinnassa käytettävä tiedostokahva (engl. *handle*), jonka kautta tietoa vastaanotetaan ja lähetetään.

Rajapintaa voidaan käyttää useiden protokollien kanssa kuten:

* AF\_UNIX, AF\_LOCAL: *Unix-domain sockets*, paikallinen
* AF\_INET: IPv4
* AF\_INET: IPv6
* AF\_IPX: Novellin IPX
* AF\_APPLETALK: Applen AppleTalk

Rajapintaa voidaan käyttää useiden tyyppien (*kommunikointityylien*) kanssa, joista tavallisimmat ovat SOCK\_STREAM ja SOCK\_DGRAM. Muita ovat SOCK\_RAW, SOCK\_RDM ja SOCK\_SEQPACKET. Rajapintaa voidaan käyttää sekä yhteydellisille että yhteydettömille tavoille.

Keskeiset järjestelmäkutsut rajapinnassa ovat:

* `socket`
* `close`
* `connect`
* `bind`
* `listen`
* `accept`

Tiedonsiirto toimii kuten tiedostojen kanssa: rajapinnan avulla luetaan ja kirjoitetaan tietoa käyttäen järjestelmäkutsupareja:

* `read, write`
* `recv, send`
* `recvfrom, sendto`
* `recvmsg, sendmsg`
* `readv, writev`

Rajapinta antaa onnistumisen merkin kun tieto on hyväksytty siirrettäväksi. Rajapinnan toiminta voidaan asettaa ei-pysäyttäväksi (engl. *non-blocking*), jolloin funktiokutsut eivät jää odottamaan.

Rajapinnan ja kommunikoinnin toimintaa voidaan muuttaa muun muassa `getsockopt` ja `setsockopt` järjestelmäkutsujen avulla.

Lähteet
-------

1. 1 2  Jim Frost: BSD Sockets: A Quick And Dirty Primer *cis.temple.edu*. Viitattu 29.3.2018.
2. 1 2 3 4  Lawrence Besaw: Berkeley UNIX System Calls and Interprocess Communication (PS) *gaia.cs.umass.edu*.  tammikuu 1987. Viitattu 29.3.2018.
3. 1 2 3 4 5  SOCKET(2) *man7.org*. Viitattu 29.3.2018.
4. ↑  socket The Open Group. Viitattu 29.3.2018.
5. 1 2  Giovanni Agosta: The POSIX Socket API (PDF) *home.deib.polimi.it*. Viitattu 29.3.2018.
6. ↑  James Pelkey: TCP/IP and XNS 1981 – 1983 *historyofcomputercommunications.info*. Viitattu 6.6.2018. (englanniksi)
7. ↑  Warren Young: Winsock Programmer’s FAQ Articles: BSD Sockets Compatibility *tangentsoft.net*. Viitattu 29.3.2018.
8. ↑  Porting Socket Applications to Winsock Microsoft. Viitattu 29.3.2018.
9. ↑  Windows Sockets *sockets.com*.  20.1.1993. Viitattu 29.3.2018.
10. ↑  Macintosh Development *web.mit.edu*. Viitattu 29.3.2018.
11. ↑  Using Sockets and Socket Streams Apple. Viitattu 29.3.2018.
12. ↑  Understanding the X/Open Transport Interface (XTI) IBM. Viitattu 29.3.2018.
13. ↑  socket *freebsd.org*. Viitattu 30.3.2018.
14. ↑  GETSOCKOPT(2) *man7.org*. Viitattu 30.3.2018.
15. ↑  GETSOCKOPT(2) *freebsd.org*. Viitattu 30.3.2018.

Kirjallisuutta
--------------

* Stevens, W. Richard: *UNIX Network Programming*. Prentice Hall. ISBN 978-0139498763.

Aiheesta muualla
----------------

* Beej's Guide to Network Programming (englanniksi)