Berkeley stikkontakter

Berkeley stikkontakter er en computing bibliotek med en application programming interface til internet stikkontakter og Unix domæne-sockets, som anvendes til at proces kommunikation.

Som API har udviklet sig med lidt modifikation fra en de facto standard i en del af POSIX-specifikationen. POSIX stikkontakter er dybest set Berkeley stikkontakter.

Historie og implementeringer

Berkeley stikkontakter opstod med 4.2BSD Unix-operativsystemet som en API. Kun i 1989, kunne dog UC Berkeley versioner af sit operativsystem og netværk bibliotek fri licensbetingelserne begrænsninger AT & amp; T Corporation proprietære Unix. Denne grænseflade implementering er den oprindelige API af internetprotokollen Suite.

Alle moderne operativsystemer nu har en vis gennemførelsen af ​​Berkeley socket interface, da det blev standard interface for tilslutning til internettet. Selv Winsock implementering til MS Windows, udviklet af ikke-associerede udviklere, følger nøje Berkeley standarden.

BSD vs POSIX

Som Berkeley socket API udviklet sig over tid, og i sidste ende ind i POSIX socket API, blev visse funktioner frarådet eller endda fjernet og erstattet af andre. POSIX API er også designet til at være reentrant. Disse funktioner nu sat den klassiske BSD API bortset fra POSIX API.

C og andre programmeringssprog

BSD stikkontakter API er skrevet i C programmeringssprog. De fleste andre programmeringssprog giver lignende grænseflader, typisk skrevet som en wrapper bibliotek baseret på C-API.

Alternativer

Strømmene-baserede Transport Layer interface API tilbyder et alternativ til stikket API. Men de seneste systemer, der giver den TLI API giver også Berkeley socket API.

Header-filer

Berkeley socket interfacet er defineret i flere header filer. Navne og indholdet af disse filer variere lidt mellem implementeringer. Generelt omfatter de:

Socket API funktioner

Denne liste er et sammendrag af funktioner eller metoder, som Berkeley stikkontakter API bibliotek:

  •  skaber en ny sokkel af en bestemt socket type, identificeret ved et heltal, og tildeler systemressourcer til det.
  •  bruges typisk på serveren side, og knytter en sokkel med en socket-adresse struktur, dvs. et bestemt lokal portnummer og IP-adresse.
  •  bruges på serveren side, og forårsager en bundet TCP socket at indtaste lytte tilstand.
  •  er anvendt på klientsiden, og tildeler en gratis lokale portnummer til en stikkontakt. I tilfælde af en TCP socket, det forårsager et forsøg på at etablere en ny TCP-forbindelse.
  •  bruges på serveren side. Det accepterer en modtaget indgående forsøg på at skabe en ny TCP-forbindelse fra den eksterne klient, og opretter en ny sokkel i forbindelse med soklen adresse par af denne forbindelse.
  •  OG, ELLER og eller og anvendes til at sende og modtage data til / fra en ekstern sokkel.
  •  får systemet til at frigøre ressourcer til en stikkontakt. I tilfælde af TCP, er forbindelsen afsluttes.
  •  og anvendes til at løse værtsnavne og adresser. IPv4 alene.
  •  bruges til pend, venter på en eller flere af en forudsat liste over sokler til at være klar til at læse, klar til at skrive, eller som har fejl.
  •  bruges til at kontrollere tilstanden af ​​et stik i et sæt af sokler. Sættet kan testes for at se, om nogen sokkel kan skrives til, læst fra eller hvis der opstod en fejl.
  •  bruges til at hente den aktuelle værdi af en bestemt socket mulighed for den angivne socket.
  •  bruges til at indstille en bestemt socket mulighed for den angivne socket.

Yderligere oplysninger er givet nedenfor.

sokkel

 skaber et slutpunkt for kommunikation og returnerer en file descriptor til soklen. tager tre argumenter:

  • domæne, som angiver den protokol familien til den skabte stik. For eksempel:
    •  for netværksprotokol IPv4 eller
    •  til IPv6.
    •  til lokal socket.
  • skriver, en af:
    • Eller
    • .
  • protokol med angivelse af selve transporten protokollen til at bruge. De mest almindelige er, ,,. Disse protokoller er specificeret i & lt; netinet / in.h & gt ;. Værdien kan anvendes til at vælge en standardprotokol fra den valgte og.

Funktionen returnerer -1 hvis der opstod en fejl. Ellers returnerer et heltal, der repræsenterer den nyligt tildelte deskriptor.

binder

 tildeler et stik til en adresse. Når en sokkel er oprettet ved hjælp, det er kun givet en protokol familie, men ikke tildelt en adresse. Denne forening med valgt adresse skal udføres med binder systemet opkaldet, før stikket kan acceptere forbindelser til andre værter. tager tre argumenter:

  • , En deskriptor, der repræsenterer soklen for at udføre binder på.
  • En pointer til en struktur, der repræsenterer adressen til at binde til.
  • , Et felt med angivelse af størrelsen af ​​strukturen.

Bind afkast 0 på succes og -1 hvis der opstår en fejl.

lyt

Efter en sokkel har været forbundet med en adresse, forbereder den til indgående forbindelser. Men dette er kun nødvendigt for stream-orienterede data tilstande, dvs. for fatningstyper. lytte kræver to argumenter:

  • , Et gyldigt socket deskriptor.
  • , Et heltal, der repræsenterer antallet af verserende forbindelser, der kan sættes i kø på et givet tidspunkt. Operativsystemet normalt lægger et loft over denne værdi.

Når en forbindelse er accepteret, det er dequeued. Ved succes, er 0 returneres. Hvis der opstår en fejl, -1 returneres.

acceptere

Når et program lytter efter stream-orienterede forbindelser fra andre værter, er det underrettes om sådanne begivenheder (jf vælge funktion) og skal initialisere forbindelse ved hjælp af funktionen. Den accepterer Funktionen opretter en ny sokkel for hver forbindelse og fjerner forbindelsen fra lyt køen. Det tager følgende argumenter:

  • Den deskriptor af lyttende socket, der har forbindelsen i kø.
  • , En pointer til en sockaddr struktur til at modtage kundens adresseoplysninger.
  • , En pointer til en placering, der angiver størrelsen af ​​kundens adresse struktur bestået at acceptere. Når vender tilbage, dette sted angiver, hvor mange bytes af strukturen blev faktisk anvendt.

Den accepterer -funktionen giver den nye socket deskriptor for accepteret forbindelse eller -1 hvis der opstår en fejl. Alle yderligere kommunikation med den eksterne vært sker nu via dette nye stik.

Datagram sockets ikke kræver behandling ved at acceptere, da modtageren straks kan reagere på anmodningen ved hjælp af lytning stik.

forbinde

Systemet opkald forbinder en sokkel, identificeret ved sin file descriptor, til en ekstern vært specificeret af denne værtens adresse på listen argumentet.

Visse typer af stikkontakter er forbindelsesløse, mest almindeligt User Datagram Protocol stikkontakter. For disse stikkontakter, tilslut tager på en særlig betydning: standard mål for at sende og modtage data bliver indstillet til den angivne adresse, der tillader anvendelse af funktioner som sende- og recv på forbindelsesløse stikkontakter.

Tilslut returnerer et heltal, der repræsenterer fejlkoden: 0 repræsenterer succes, mens -1 repræsenterer en fejl.

gethostbyname og gethostbyaddr

Den og funktioner bruges til at løse værtsnavne og adresser i domænenavnet system eller den lokale værtens andre resolver mekanismer. De vender tilbage en pegepind til et objekt af typen struct hostent, som beskriver en Internet Protocol vært. Funktionerne tager følgende argumenter:

  • navn angiver navnet på værten. For eksempel: angiver en pointer til en struct in_addr indeholder adressen på værten.
  • len angiver længden i byte af adr.
  • Angiver adressen familie type af værten adresse.

Funktionerne returnere en NULL pointer i tilfælde af fejl, i hvilket tilfælde den eksterne heltal h_errno kan kontrolleres for at se, om det er en midlertidig fejl eller en ugyldig eller ukendt vært. Ellers et gyldigt struct hostent * returneres.

Disse funktioner er ikke strengt en bestanddel af BSD socket API, men er ofte anvendt i forbindelse med API-funktioner. Desuden er disse funktioner nu betragtes legacy grænseflader til at forespørge domænenavnet systemet. Nye funktioner, der er helt protokol-agnostisk er blevet defineret. Disse nye funktion er getaddrinfo og getnameinfo, og er baseret på en ny addrinfo datastruktur.

Protokol og adresse familier

Stikket API er et generelt interface til Unix netværk og tillader brug af forskellige netværksprotokoller og behandler arkitekturer.

Følgende lister et udsnit af protokol familier defineret i en moderne Linux eller BSD implementering:

Et stik til kommunikation ved hjælp enhver familie er skabt med socket-funktion, ved at angive den ønskede protokol familien som et argument.

Det oprindelige designkoncept af soklen grænsefladen skelnes mellem protokol typer og de specifikke adresser typer, som hver kan bruge. Det blev forudset, at en protokol familie kan have flere adresser typer. Adressetyper blev defineret af yderligere symbolske konstanter og bruger præfikset AF_ stedet for PF_. De AF_-identifikatorer er beregnet til alle datastrukturer, der specifikt beskæftiger sig med adressen type og ikke protokollen familien. Imidlertid har dette begreb om adskillelse af protokol og adresse typen ikke fundet støtte implementering og AF_-konstanter var simpelthen defineret af den tilsvarende protokolidentifikator, gør sondringen mellem AF_ versus PF_ konstanter en teknisk argument ingen signifikant praktisk konsekvens. Faktisk eksisterer megen forvirring i den korrekte brug af begge former.

Men den nuværende POSIX.1 2008 specifikationen ikke angive nogen af ​​PF_-konstanter, men kun AF_-konstanter

Rå sokler

Den mest detaljerede og kraftfuld metode er kontrol på det rå sokkel niveau. Meget få programmer skal graden af ​​kontrol over kommunikation, som det giver, så rå sokler støtte skulle være kun tilgængelig på computere, der bruges til at udvikle internet-relaterede teknologier. Eksempler på programmer ved hjælp rå stikkontakter er ping og traceroute. De fleste operativsystemer understøtter rå sokler, på grund af sin lette gennemførelsen.

Indstillinger for stikkontakter

Efter oprettelse af en sokkel, er det muligt at angive indstillinger på det. Nogle af de mere almindelige muligheder er:

  •  deaktiverer Nagle algoritme.
  •  muliggør periodiske 'aktivitetsegenskaber' pinger, hvis det understøttes af OS.

Blokering vs. ikke-blokerende modus

Berkeley sockets kan fungere i én af to tilstande: blokering eller ikke-blokerende.

Et blokerende socket vil ikke vende tilbage kontrol, indtil den har sendt nogle eller alle data, der er angivet for operationen. Det er normalt for en blokerende socket ikke at sende alle data. Ansøgningen skal kontrollere returværdien til at bestemme, hvor mange bytes er blevet sendt eller modtaget, og den skal sende data, der ikke allerede er behandlet. Ved brug af blokerende stikkontakter, bør tages særligt hensyn til at acceptere, da det stadig kan blokere efter indikerer læsbarheden, hvis en klient afbryder under forbindelsen fase.

På den anden side vil en ikke-blokerende socket tilbage, hvad der er i modtagerbufferen og straks fortsætte. Hvis ikke skrevet korrekt, programmer ved hjælp af ikke-blokerende stikkontakter er særligt modtagelige til race betingelser på grund af forskelle i netværk forbindelseshastighed.

En sokkel er typisk indstillet til at blokere eller blokerende tilstand ved hjælp af eller funktioner.

Afslutning stikkontakter

Operativsystemet ikke frigive ressourcer, der tildeles en sokkel, indtil der opstår et opkald på soklen deskriptor. Dette er især vigtigt, hvis opkaldet mislykkes, og kan prøves igen. Hver vellykket opkald til, skal have en matchende kald til i alle mulige udførelse stier. Header fil & lt; unistd.h & gt; definerer tæt funktion.

Når systemet opkald initieres af en ansøgning, er det kun interface til terminal ødelagt, ikke soklen selv. Det er kernen ansvar at ødelægge stikket internt. Nogle gange kan en sokkel indtaste en stat, på serveren side, for op til 4 minutter.

På SVR4 systemer brug af kan kassere data. Det kan være nødvendigt at anvende eller SO_LINGER om disse systemer for at sikre levering af alle data.

Klient-server eksempel bruger TCP

Transmission Control Protocol er en forbindelse orienteret protokol, der giver en bred vifte af fejlkorrektion og ydeevne funktioner til transmission af byte streams. En proces skaber en TCP socket ved at kalde funktionen med parametrene for den protokol familien, socket mode for Stream Sockets, og IP-protokollen identifikator for TCP.

Server

Opsætning af en simpel TCP server involverer følgende trin:

  • Oprettelse af en TCP socket, med en opfordring til.
  • Binding soklen til at lytte havn, med en opfordring til. Før du ringer, skal en programmør erklære en struktur, klare det, og det, og fylde sine marker. Konvertering af en til netværk byte orden kan gøres ved at kalde funktionen.
  • Forberedelse af soklen for at lytte efter forbindelser, med en opfordring til.
  • Accept indgående forbindelser via et opkald til. Dette blokerer indtil en indgående forbindelse er modtaget, og derefter returnerer en sokkel deskriptor for det accepterede forbindelse. Den indledende deskriptor fortsat en lyttende deskriptor, og kan kaldes igen til enhver tid med dette stik, indtil den er lukket.
  • Kommunikation med den eksterne vært, hvilket kan gøres gennem og eller og.
  • Til sidst lukker hver sokkel, der blev åbnet, når det ikke længere er nødvendig, bruger.

Kode kan oprette en TCP-server på port 1100 som følger:

Klient

Programmering af en TCP klient program omfatter følgende trin:

  • Oprettelse af en TCP socket, med en opfordring til.
  • Tilslutning til serveren med brug af, passerer en struktur med sættet til, indstillet til havnen slutpunktet lytter, og indstilles til IP-adressen for den lyttende serveren
  • Kommunikerer med serveren ved at bruge og eller og.
  • Afslutning af forbindelsen og oprydning med et opkald til.

Klient-server eksempel ved hjælp af UDP

User Datagram Protocol er en forbindelsesløs protokol uden nogen garanti for levering. UDP-pakker kan ankomme ude af rækkefølge, flere gange, eller slet ikke. På grund af denne minimale design, UDP har betydeligt mindre hovedhøjde end TCP. Bliver forbindelsesløse betyder, at der ikke er nogen begrebet en strøm eller permanent forbindelse mellem to værter. Sådanne data benævnes datagrammer.

UDP adresserum, rummet af UDP portnumre, er fuldstændig disjunkte sig fra TCP-porte.

Server

Kode kan oprette en UDP-server på port 7654 som følger:

Denne uendelig løkke modtager nogen UDP datagrammer til port 7654 ved hjælp recvfrom. Det bruger parametrene:

  • sokkel
  • pointer til buffer for data
  • størrelsen af ​​buffer
  • flag
  • adresse struct for at sende peer
  • længde adresse struct for at sende peer.

Klient

En simpel demonstration af at sende en UDP-pakke, der indeholder strengen "Hello World!" at tage fat 127.0.0.1 og port 7654 kan se sådan ud:

I denne kode, er en pointer til de data, der skal sendes, og angiver størrelsen af ​​data.

Forbehold

For TCP-forbindelser, kan operativsystemet nødt til at videresende data, som afgives til det med et opkald. Men brugeren plads Programmet er gratis at slette databufferen øjeblikkeligt til efter afkast. Dette indebærer, at operativsystemet skal lave en kopi af de data, der kan føre til en betydelig CPU-belastning i høje overførselshastighed / ydeevne applikationer. Andre API'er, såsom dem, der støtter RDMA kræver, at data bufferen ikke frigives, før bekræftelse fra den fjerne ende er blevet modtaget, og således gøre det muligt at have nul hukommelse kopifunktioner.

  0   0
Næste artikel Dan W. Reicher

Relaterede Artikler

Kommentarer - 0

Ingen kommentar

Tilføj en kommentar

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Tegn tilbage: 3000
captcha