Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Iron
  • Aplikacija tcp ip klijent server. Klijent-server aplikacija na TCP stream socketu

Aplikacija tcp ip klijent server. Klijent-server aplikacija na TCP stream socketu

Klijent-server aplikacija na TCP stream socketu

Sljedeći primjer koristi TCP za pružanje urednih, pouzdanih dvosmjernih tokova bajtova. Hajde da napravimo kompletnu aplikaciju koja uključuje klijenta i servera. Prvo, demonstriramo kako konstruirati server koristeći TCP stream utičnice, a zatim klijentsku aplikaciju za testiranje našeg servera.

Sljedeći program kreira server koji prima zahtjeve za povezivanje od klijenata. Server se gradi sinhrono, stoga je izvršenje niti blokirano sve dok server ne pristane da se poveže sa klijentom. Ova aplikacija pokazuje jednostavan server koji odgovara klijentu. Klijent prekida vezu slanjem poruke serveru .

TCP server

Kreiranje strukture servera prikazano je na sljedećem funkcionalnom dijagramu:

Evo kompletnog koda za program SocketServer.cs:

// SocketServer.cs koristeći System; koristeći System.Text; koristeći System.Net; koristeći System.Net.Sockets; imenski prostor SocketServer ( klasa Program ( static void Main(string args) ( // Postavite lokalnu krajnju tačku za utičnicu IPHostEntry ipHost = Dns.GetHostEntry("localhost"); IPAddress ipAddr = ipHost.AddressList; IPEndPoint ipPEndPoint, new IpEndPoint, new 11000 ); // Kreirajte Tcp/Ip utičnicu Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Dodijelite utičnicu lokalnoj krajnjoj točki i slušajte dolazne utičnice pokušajte ( sListener.Bind( ipEndPoint); sListener. Listen(10); // Počnite osluškivati ​​veze dok (true) (Console.WriteLine("Čeka se konekcija na portu (0)", ipEndPoint); // Program se pauzira, čeka dolazna konekcija Socket handler = sListener.Accept(); string data = null; // Čekali smo da se klijent pokuša povezati s nama byte bytes = new byte; int bytesRec = handler.Receive(bytes); data += Encoding. UTF8.GetString(bytes, 0, bytesRec); // Prikaži podatke na konzoli Console.Write("Primljeni tekst: " + data + "\n\n"); // Pošaljite odgovor klijentu\ string reply = "Hvala na zahtjevu u " + data.Length.ToString() + " znakovima"; byte msg = Encoding.UTF8.GetBytes(reply); handler.Send(msg); if (data.IndexOf(" ") > -1) ( Console.WriteLine("Server je prekinuo vezu sa klijentom."); break; ) handler.Shutdown(SocketShutdown.Both); handler.Close(); ) ) catch (izuzetak ex) ( Console.WriteLine (ex.ToString()); ) konačno ( Console.ReadLine(); ) ) ) )

Pogledajmo strukturu ovog programa.

Prvi korak je postavljanje utičnice na lokalnu krajnju točku. Prije otvaranja utičnice za slušanje veza, morate pripremiti adresu lokalne krajnje točke za nju. Jedinstvena TCP/IP adresa za servisiranje određena je kombinacijom IP adrese hosta sa brojem servisnog porta, koji kreira krajnju tačku servisiranja.

Dns klasa pruža metode koje vraćaju informacije o mrežnim adresama koje podržava uređaj na lokalnoj mreži. Ako LAN uređaj ima više od jedne mrežne adrese, Dns klasa vraća informacije o svim mrežnim adresama, a aplikacija mora odabrati odgovarajuću adresu za posluživanje iz niza.

Kreirajmo IPEndPoint za server kombinujući prvu IP adresu računara domaćina dobijenu metodom Dns.Resolve() sa brojem porta:

IPHostEntry ipHost = Dns.GetHostEntry("localhost"); IPAddress ipAddr = ipHost.AddressList; IPEndPoint ipEndPoint = nova IPEndPoint(ipAddr, 11000);

Ovdje klasa IPEndPoint predstavlja localhost na portu 11000. Zatim kreiramo stream socket sa novom instancom klase Socket. Nakon što smo postavili lokalnu krajnju točku za slušanje veza, možemo kreirati utičnicu:

Socket sListener = novi Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

Transfer AdresaPorodica specificira šeme adresiranja koje instanca klase Socket može koristiti za rješavanje adrese.

U parametru SocketType TCP i UDP utičnice su različite. U njemu možete definirati, između ostalog, sljedeće vrijednosti:

Dgram

Podržava datagrame. Vrijednost Dgram zahtijeva da se Udp specificira za tip protokola i InterNetwork u parametru porodice adresa.

Sirova

Podržava pristup osnovnom transportnom protokolu.

Potok

Podržava stream utičnice. Vrijednost Stream zahtijeva da se Tcp navede za tip protokola.

Treći i posljednji parametar specificira tip protokola koji je potreban za utičnicu. U parametru ProtocolType Možete odrediti sljedeće najvažnije vrijednosti - Tcp, Udp, Ip, Raw.

Sljedeći korak bi trebao biti dodjeljivanje utičnice pomoću metode Bind(). Kada konstruktor otvori soket, njemu se ne dodeljuje ime, već je rezervisan samo rukohvat. Metoda Bind() se poziva da dodijeli ime serverskoj utičnici. Da bi klijentska utičnica identificirala utičnicu TCP toka, serverski program mora svojoj utičnici dati ime:

SListener.Bind(ipEndPoint);

Metoda Bind() povezuje utičnicu s lokalnom krajnjom točkom. Metoda Bind() mora se pozvati prije bilo kakvog pokušaja pozivanja metoda Listen() i Accept().

Sada, nakon što ste kreirali socket i povezali ime s njim, možete slušati dolazne poruke koristeći metodu slušaj(). U stanju slušanja, utičnica će slušati pokušaje dolaznog povezivanja:

SListener.Listen(10);

Parametar definira zaostatak, što označava maksimalan broj veza koje čekaju u redu čekanja. U gornjem kodu, vrijednost parametra dozvoljava da se do deset veza akumulira u redu čekanja.

U stanju slušanja, morate biti spremni da pristanete na povezivanje s klijentom, za koji se metoda koristi prihvatiti(). Ova metoda dobiva vezu klijenta i dovršava asocijaciju imena klijenta i poslužitelja. Metoda Accept() blokira nit pozivajućeg programa dok se ne uspostavi veza.

Metoda Accept() uklanja prvi zahtjev za povezivanje iz reda zahtjeva na čekanju i kreira novu utičnicu za obradu. Iako se kreira nova utičnica, originalna utičnica nastavlja da sluša i može se koristiti s višestrukim nitima za prihvaćanje višestrukih zahtjeva za povezivanje od klijenata. Nijedna serverska aplikacija ne bi trebala zatvoriti utičnicu za slušanje. Mora nastaviti da radi zajedno sa utičnicama kreiranim metodom Accept za obradu dolaznih zahtjeva klijenata.

Dok (true) ( ​​Console.WriteLine("Čeka se konekcija na portu (0)", ipEndPoint); // Program pauzira dok čeka na dolaznu vezu Socket handler = sListener.Accept();

Nakon što klijent i server uspostave međusobnu vezu, poruke se mogu slati i primati korištenjem metoda Pošalji() I Primi() class Socket.

Metoda Send() zapisuje odlazne podatke u povezanu utičnicu. Metoda Receive() čita dolazne podatke u stream socket. Kada koristite sistem zasnovan na TCP-u, mora se uspostaviti veza između utičnica prije izvršavanja metoda Send() i Receive(). Tačan protokol između dva komunikaciona entiteta mora biti definiran unaprijed tako da klijentska i serverska aplikacija ne blokiraju jedna drugu ne znajući ko bi trebao prvi poslati njihove podatke.

Kada je razmjena podataka između servera i klijenta završena, morate zatvoriti vezu koristeći metode Ugasiti() I Zatvori():

Handler.Shutdown(SocketShutdown.Both); handler.Close();

SocketShutdown je enum koji sadrži tri vrijednosti koje treba zaustaviti: Oba- zaustavlja slanje i primanje podataka preko utičnice, Primite- zaustavlja utičnicu da prima podatke i Pošalji- zaustavlja slanje podataka preko utičnice.

Utičnica se zatvara pozivanjem metode Close(), koja takođe postavlja svojstvo Connected utičnice na false.

TCP klijent

Funkcije koje se koriste za kreiranje klijentske aplikacije su manje-više slične serverskoj aplikaciji. Kao i kod servera, iste metode se koriste za određivanje krajnje tačke, instanciranje utičnice, slanje i primanje podataka i zatvaranje utičnice.

Serveri koji implementiraju ove protokole na korporativnoj mreži daju klijentu IP adresu, gateway, mrežnu masku, servere imena, pa čak i štampač. Korisnici ne moraju ručno da konfigurišu svoje hostove da bi koristili mrežu.

Operativni sistem QNX Neutrino implementira drugi protokol za automatsku konfiguraciju pod nazivom AutoIP, koji je projekat IETF komiteta za automatsku konfiguraciju. Ovaj protokol se koristi u malim mrežama za dodjelu IP adresa vezanih za hostove. Protokol AutoIP nezavisno određuje lokalnu IP adresu za vezu, koristeći šemu pregovaranja sa drugim domaćinima i bez kontaktiranja centralnog servera.

Korištenje PPPoE protokola

Skraćenica PPPoE je skraćenica od Point-to-Point Protocol over Ethernet. Ovaj protokol inkapsulira podatke za prijenos preko Ethernet mreže sa premoštenom topologijom.

PPPoE je specifikacija za povezivanje Ethernet korisnika na Internet preko širokopojasne veze, kao što je iznajmljena digitalna pretplatnička linija, bežični uređaj ili kablovski modem. Upotreba PPPoE protokola i širokopojasnog modema omogućava korisnicima lokalne računarske mreže individualni, autentificirani pristup mrežama podataka velike brzine.

PPPoE protokol kombinuje Ethernet tehnologiju sa PPP protokolom, efektivno stvarajući zasebnu vezu sa udaljenim serverom za svakog korisnika. Kontrola pristupa, obračun veze i izbor provajdera usluga određuju se za korisnike, a ne za domaćine. Prednost ovakvog pristupa je u tome što ni telefonska kompanija ni internet provajder ne moraju pružiti nikakvu posebnu podršku za to.

Za razliku od dial-up veza, DSL i kablovski modem veze su uvijek aktivne. Budući da se fizička veza sa udaljenim provajderom usluga dijeli između više korisnika, potrebna je računovodstvena metoda koja evidentira pošiljatelje i odredišta prometa i naplaćuje korisnicima. PPPoE protokol omogućava korisniku i udaljenom domaćinu koji učestvuju u komunikacijskoj sesiji da nauče međusobne mrežne adrese tokom početne razmjene tzv. detekcija(otkriće). Kada se uspostavi sesija između pojedinačnog korisnika i udaljenog hosta (npr. Internet provajdera), sesija se može pratiti u svrhu obračunavanja. Mnogi domovi, hoteli i korporacije pružaju javni pristup internetu putem digitalnih pretplatničkih linija koristeći Ethernet tehnologiju i PPPoE protokol.

Veza putem PPPoE protokola sastoji se od klijenta i servera. Klijent i server rade koristeći bilo koji interfejs koji je blizak Ethernet specifikacijama. Ovaj interfejs se koristi za izdavanje IP adresa klijentima i povezivanje tih IP adresa sa korisnicima i opciono sa radnim stanicama, a ne samo autentifikacija zasnovana na radnoj stanici. PPPoE server kreira vezu od tačke do tačke za svakog klijenta.

Postavljanje PPPoE sesije

Da biste kreirali PPPoE sesiju, trebali biste koristiti uslugupppoed. Modulio-pkt-*nPruža usluge PPPoE protokola. Prvo treba da trčišio-pkt-*Withodgovarajući vozač. Primjer:

Putovanje kroz mrežne protokole.

TCP i UDP su oba protokola transportnog sloja. UDP je protokol bez veze sa negarantovanom dostavom paketa. TCP (Transmission Control Protocol) je protokol orijentisan na vezu sa garantovanom dostavom paketa. Prvo sledi rukovanje (Halo. | Zdravo. | Hajde da ćaskamo? | Idemo.), nakon čega se smatra da je veza uspostavljena. Zatim se preko ove veze šalju paketi naprijed-nazad (razgovor je u toku) i provjerava se da li je paket stigao do primaoca. Ako je paket izgubljen, ili je stigao, ali sa pokvarenom kontrolnom sumom, onda se ponovo šalje („ponovi, nisam čuo“). Dakle, TCP je pouzdaniji, ali je složeniji sa stanovišta implementacije i, shodno tome, zahtijeva više taktova/memorije, što nije najmanje važno za mikrokontrolere. Primjeri aplikacijskih protokola koji koriste TCP uključuju FTP, HTTP, SMTP i mnoge druge.

TL;DR

HTTP (Hypertext Transfer Protocol) je aplikacijski protokol pomoću kojeg server šalje stranice u naš pretraživač. HTTP se sada široko koristi na World Wide Webu za dohvaćanje informacija sa web stranica. Na slici je prikazana lampica na mikrokontroleru sa ugrađenim operativnim sistemom u kojoj se boje podešavaju preko pretraživača.

HTTP protokol je baziran na tekstu i prilično je jednostavan. Zapravo, ovako izgleda GET metoda koju uslužni program netcat šalje na lokalnu IPv6 adresu servera sa svjetlima:

~$ nc fe80::200:e2ff:fe58:b66b%mazko 80<

HTTP metoda je obično kratka engleska riječ napisana velikim slovima i osjetljiva je na velika i mala slova. Svaki server mora podržavati barem metode GET i HEAD. Pored metoda GET i HEAD, često se koriste metode POST, PUT i DELETE. Metoda GET se koristi za traženje sadržaja određenog resursa, u našem slučaju ovdje GET /b HTTP/1.0 gdje je /b putanja odgovorna za boju (plava). Odgovor servera:

HTTP/1.0 200 OK Server: Contiki/2.4 http://www.sics.se/contiki/ Veza: zatvori Cache-Control: bez predmemorije, bez skladištenja, mora se ponovo potvrditi Pragma: bez keša Ističe: 0 Sadržaj- tip: text/html Contiki RGB

Crvena je ISKLJUČENA

Zelena je ISKLJUČENA

Plava je UKLJUČENA

Statusni kod (imamo 200) je dio prvog reda odgovora servera. To je trocifreni cijeli broj. Prva cifra označava klasu uslova. Šifra odgovora obično je praćena izrazom objašnjenja na engleskom jeziku odvojenom razmakom, koji osobi objašnjava razlog za ovaj konkretni odgovor. U našem slučaju server je radio bez grešaka, sve je bilo u redu (OK).

I zahtjev i odgovor sadrže zaglavlja (svaki red je zasebno polje zaglavlja, par ime-vrijednost je odvojen dvotočkom). Zaglavlja završavaju praznim redom, nakon čega mogu slijediti podaci.

Moj pretraživač odbija da otvori lokalnu IPv6 adresu, tako da je dodatna adresa upisana u firmver mikrokontrolera i isti prefiks takođe treba da bude dodeljen virtuelnom mrežnom interfejsu simulatora:

~$ sudo ip addr add abcd::1/64 dev mazko # linux ~$ netsh interfejs ipv6 postavi adresu mazko abcd::1 # windows ~$ curl http://

Najbolji članci na ovu temu