SO_REUSEADDR Soket -parameter

SO_REUSEADDR Soket -parameter

Du har kanskje prøvd mange C-funksjoner, mange Posix C-bibliotekfunksjoner og UNIX-baserte C-funksjoner i programmene dine. De fleste av C -funksjonene relatert til POSIX eller nettverk bruker noen flagg i parentesen deres som et argument eller brukt til spesifikke formål. Har du noen gang prøvd å lære noen innebygde flagg mens du programmerer? Hvis ikke, er det helt greit.

Vi vil diskutere bruken av SO_REUSEADDR -flagget til C i denne artikkelen. Det er et heltalls flagg av boolsk type som spesifiserer om den lokale adressen til den lokale adressen skal tillates av reglene som brukes til å validere adressene som er gitt i Bind System -samtalene. Dette betyr at en stikkontakt kan binde seg for AF_INET -stikkontaktene, og hindrer tilstedeværelsen av en aktiv lyttingskontakt koblet til adressen. Det er ikke mulig å binde seg til en spesifisert port for en lyttende sokkel når den er konfigurert til inaddr_any for enhver lokal adresse.

Bind -metoden kan gjenbruke den lokale adressen etter å ha brukt SO_REUSEADDR -flagget. Merk at den lokale adressen, som er sammensatt av IP -adresse og portnummer, betyr at to lokale adresser kan sameksistere i seg selv hvis noen IP- eller portnummerdel er forskjellig og derfor ikke nødvendiggjør anvendelsen av dette flagget. Den lokale adressen kan ikke brukes med denne parameteren hvis den allerede er åpnet med en stikkontakt som er i en lytt til tilstand. Når den lokale adressen til stikkontakten er i lyttestatusen og IP -komponenten i adressen er noe, overvåkes alle de lokale IP -ene. Bindet kan ikke lenger opprettholde noen lokale adresser for denne havnen, selv med dette argumentet.

Eksempel:

Her er klientkoden som brukes til at klientene skal koble seg til serveren ved hjelp av de to separate IP -adressene. Klienten i følgende eksempel ønsker å koble seg til serveren som bruker et annet portnummer, men den samme IP -adressen. Den lokale verts -IP -adressen og portverdien ble gitt til Connect_TCP -funksjonen i den første samtalen der de ble satt til 8888.

Etter å ha bindet til den lokale adressen, brukte systemet imidlertid UNIX socket -domenet for å utføre en andre sokkelforbindelse der IP -adressen forble den samme, men portnummeret ble endret til 7777. Det betyr at en klient er koblet til to forskjellige sokkeladresser på en enkelt TCP -forespørsel, noe som kan tenkes fordi adressene er forskjellige. Denne koden lenker til den målrettede maskinen etter å ha bindet den lokale adressen først. De to bindingsforsøkene bør være vellykkede fordi, som de nevnte viser, IP -delen av de lokale adressene til de to bindetilkoblingene varierer.

Ved å bruke en Linux -kommandolinjeterminal, kompilerer du koden ved hjelp av GCC -kompilatoren for C Language Code:

Ved hjelp av NCAT -kommandoen etterligner vi serveren:

For å se hver sokkelstatus for portnummer 7777, bruk SS -kommandoen:

Følgende utgang viser stikkontaktstatus for portnummer 7777:

Som det fremgår av det peviøse skjermbildet, er det nå ingen annen forbindelse, og bare NCAT -serveren lytter på port 7777. Etter å ha utført utdatafilen som er opprettet i kompilasjonstrinnet, utfør den.

Utfør nå den samme kommandoen etter å ha utført utdatafilen til forrige kode i Linux -terminalen. Legg merke til at det er to samtaler for Connect_TCP -tilkobling, da er fire tilkoblinger etablert under disse samtalene.

Nå som to tilkoblinger er vellykket, en med 127.0.0.1 og port 7777 og den andre ved hjelp av port 8888, mottok vi følgende utgang. Det er fire tilkoblinger totalt sett på følgende skjermbilde fordi vi påkalte Connect TCP -metoden to ganger:

Det er fire estab (etablering) tilstandstilkoblinger synlig, noe som er normalt fordi utgangen er fra serversiden og klientsiden. De aller tre første linjene er skrevet fra serverens perspektiv mens de påfølgende to blir presentert fra klientens. Prosessnavnet i bakgrunnen viser også dette. Før han blir med, kan klienten koble til mange lokale IP -adresser, og serveren kan gjøre det samme ved å bruke et mål. Det kan binde seg til en rekke lokale adresser før overvåking uten SO_REUSEADDR -argumentet. Vi vil ikke illustrere det nå fordi programvarekoden er lik. Koden binder først den lokale adressen til måladressen, som enten er 127.0.0.1: 7777 eller 127.0.0.1: 7778, og utfør deretter en forbindelse til disse IP -adressene.

Når vi kjører denne klienten, vises den på skjermen "adressen som allerede er i bruk" som indikerer at den første klienten har denne adressen. Den forrige koden er nå endret ved bare å legge til noen flere linjer i koden for å bruke SO ReuseAddr -flagget. Vi ønsker å koble klienten vår til en lignende sokkeladresse som allerede er brukt eller holdt av en annen klient. Her er kodebiten til den modifiserte koden:

Vi brukte VIM -redigereren for å åpne filen og la til koden i innsatsmodus.

Kompiler koden på nytt. Men før du gjør det, må du merke deg følgende: Opprett en ny fil eller bruk en eksisterende, og endre utskriftsfilens navn under sammenstilling. Etter sammenstilling, utfør utdatafilen ved hjelp av kommandolinjeterminalen. Etter utførelse kan vi se at en klient er koblet til samme IP -adresse og portnummer der vår første klient ble tilkoblet. Dette er fordi vi brukte SO_REUSEADDR -flagget.

Konklusjon

Dette handler om bruken av SO_REUSEADDR -sokkelparameteren som er et flagg av boolsk type på C -språket. Vi har sett et eksempel ved å bruke SO_REUSEADDR -sokkelparameteren for å spesifisere om den lokale adressen som brukes på nytt i videre programmer eller tråder, skal tillates av instruksjonene som brukes til å autentisere adressene bare hvis i BIND -systemanropene.