Berkeley sockets

Berkeley sockets, BSD socket API eller bara sockets är ett programmeringsgränssnitt (API) för framförallt interprocesskommunikation, ursprungligen utvecklat för BSD.

Programbiblioteket som implementerar gränssnittet som till en början användes för att utveckla applikationer i vilka olika processer behöver kommunicera, vanligtvis för att en klient och en server ska kunna skicka information över ett datornätverk. Gränssnittet fanns ursprungligen  tillgängligt endast genom programmeringsspråket C, men numera används det i nästan alla programspråk.

Berkeley sockets följde med i Unix' version 4.2BSD, som släpptes år 1983.

Berkeley sockets eller "sockets", som det brukar kallas, används i nästan all kommunikation över Internet. En socket används för kommunikationen mellan två parter. Dessa två parter är oftast två program men kan även vara till exempel två trådar i samma datorprogram.

Sockets är en teknik där processen (programmet) skapar ett läs- och skriv- "handtag" (engelska "handle"). Via detta "socket-handtag" (kan liknas med öppningen till ett "rör" liknande rörpost) skickas och tas information emot. Vid socket-kommunikation så agerar ofta den ena parten klient och den andra parten server men sockets kan även användas för kommunikation mellan såväl två klienter som två servrar.

Sockets används i alla typer av programvara och i de flesta olika programmeringsspråk och operativsystem så som exempelvis:

 FreeBSD, NetBSD, OpenBSD
 Linux baserade system
 Microsoft Windows sockets "Winsock" är socket-liknande interface.
(Är kompatibelt med Berkeley sockets på nätverksnivå)
 Java Sockets 
 Python sockets
 Perl sockets
 De flesta andra skriptspråk (så som till exempel PHP, Visual Basic, Python)
 Wii, med DevkitPro
 De flesta andra operativsystem som kopplas till datornätverk, till exempel till Internet

Sockets används i bland annat klient- och serverprogramvara som hanterar webb, e-post och snabbmeddelanden.

gethostbyname() 

gethostbyname(), gethostbyname_r() är en funktion som används vid uppkoppling för att översätta ett DNS-namn till en IP-adress (se Internetprotokoll).

Ett exempel i C hur man översätter ett namn till en IPv4 adress  

#include <netdb.h>
#include <stdio.h>
#include <alloca.h>
#include <errno.h>

int main(int argc, char *argv[])
{
  char *host;
  struct hostent hostbuf, *hp;
  size_t hstbuflen;
  char *tmphstbuf;
  int res;
  int herr;
  struct in_addr  **pptr;

  h_errno = 0;

  if(argc != 2)
    {
      printf("Usage: %s hostname\n", argv[0]);
      exit(1);
    }
  else
    {
      host  = argv[1];
    }

  hstbuflen = 1024;
  /* Allocate buffer, remember to free it to avoid memory leakage.  */
  tmphstbuf = malloc (hstbuflen);
  memset(tmphstbuf, 0x00, hstbuflen);

  while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen, &hp, &herr)) == ERANGE)
    {
      /* Enlarge the buffer.  */
      hstbuflen *= 2;
      tmphstbuf = realloc (tmphstbuf, hstbuflen);
    }

  if((res != 0) || (hp == NULL))
    {
      herror("Error");
      printf("Hsterror [%s]\n" , hstrerror (h_errno ));

      printf ("gethostbyname_r returned: %d\n", res);
      printf ("herr: %d\n", herr);
      printf ("hp is %s\n", hp == NULL ? "null" : "set");
    }
  else
    {
      pptr = (struct in_addr **)hp->h_addr_list;
      while( *pptr != NULL )
      {
        printf("ip address: %s\n", inet_ntoa(**(pptr++)));
      }
    }

  free(tmphstbuf);

  return 0;
}

Se även
DNS
Internetprotokoll
TCP/IP

Externa länkar 
 GNU information
 I programspråket PHP
 I .NET
 I programspråket Python
 I programspråket VisualBasic
 I programspråket Perl
 I programspråket Ruby
 Required ports to use Google Talk
 :en:Berkeley_sockets#gethostbyname.28.29_and_gethostbyaddr.28.29

Referenser 

Interprocesskommunikation