Berkeley sockets

Från Wikipedia
Hoppa till: navigering, sök

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 användes 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[källa behövs] 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:

(Är kompatibelt med Berkeley sockets på nätverksnivå)[förtydliga]

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

gethostbyname()[redigera | redigera wikitext]

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[redigera | redigera wikitext]

#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[redigera | redigera wikitext]

Externa länkar[redigera | redigera wikitext]

Referenser[redigera | redigera wikitext]