API-ul Berkeley socket a format un standard de abstracție de facto pentru prizele de rețea. Majoritatea limbilor de programare utilizează o interfață similară API-ului de limbă C.
Interfața pentru interfața de straturi de transport (TLI), bazată pe STREAMS, este o alternativă la API-ul socket. Cu toate acestea, API-urile de socket Berkeley sunt mult mai răspândite în popularitate și în numărul de implementări.
Berkeley interfață soclu
Interfața socketului Berkeley este un API. permițând punerea în aplicare a interacțiunii dintre computere sau între procese pe un singur computer. Această tehnologie poate funcționa cu multe dispozitive de intrare / ieșire și drivere diferite. În ciuda faptului că sprijinul lor depinde de implementarea sistemului de operare. Această implementare a interfeței stă la baza TCP / IP. care este considerată una dintre tehnologiile fundamentale pe care se bazează Internetul. Tehnologia pentru prize a fost dezvoltată pentru prima oară la UC Berkeley pentru utilizarea pe sistemele Unix. Toate sistemele de operare moderne au o implementare a interfeței socket Berkeley, deoarece aceasta a devenit o interfață standard pentru conectarea la Internet.
Programatorii pot accesa interfața socket-ului la trei nivele diferite, dintre care cel mai puternic și fundamental este nivelul de prize brute. Totuși, câteva aplicații trebuie să limiteze controlul asupra conexiuni de ieșire, puse în aplicare de acestea, astfel încât sprijinul pentru socketuri considerate a fi disponibile numai pe computerele care sunt utilizate pentru dezvoltarea pe baza tehnologiilor legate de Internet. Ulterior, majoritatea sistemelor de operare și-au implementat sprijinul, inclusiv Windows XP.
Fișiere de antet
Biblioteca socketurilor din Berkeley include mai multe fișiere de antet asociate. Printre acestea:
socket () creează punctul final al conexiunii și returnează un descriptor. socket () are trei argumente:
- domeniu. Specifică familia de protocoale pentru socket-ul creat. De exemplu:
- PF_INET pentru protocolul de rețea IPv4 sau
- PF_INET6 pentru IPv6.
- PF_UNIX pentru prize locale (utilizând un fișier).
- tipul (tipul) unul dintre:
- SOCK_STREAM (serviciu de încredere (serviciu) sau stream socket)
- SOCK_DGRAM (serviciu datagram sau socket datagram)
- SOCK_SEQPACKET (serviciu serios de pachete seriale) sau
- SOCK_RAW (Un socket brut este un protocol brut pe un strat de rețea).
- protocol definește protocolul de transport utilizat. Cea mai comună este IPPROTO_TCP. IPPROTO_SCTP. IPPROTO_UDP. IPPROTO_DCCP. Aceste protocoale sunt specificate în
. Valoarea "0" poate fi utilizată pentru a selecta protocolul implicit din domeniul și tipul specificat.
Funcția returnează -1 dacă apare o eroare. În caz contrar, returnează un număr întreg reprezentând descriptorul atribuit.
gethostbyname () și gethostbyaddr ()
Funcțiile returnează un indicator NULL în cazul unei erori. În acest caz, un număr întreg suplimentar h_errno poate fi testat pentru a detecta o eroare sau o gazdă incorectă sau necunoscută. În caz contrar, se va returna structura corectă *.
connect () Returnează un întreg reprezentând codul de eroare: 0 înseamnă executarea cu succes și -1 indică o eroare.
Un server descărcat poate respinge o încercare de conectare, deci la unele tipuri de programe este necesar să se furnizeze încercări repetate de conectare.
Returnează 0 pentru succes și -1 pentru o eroare.
() pregătește soclul bindabil pentru a accepta conexiunile primite. Această funcție este valabilă numai pentru tipurile socket-urilor SOCK_STREAM și SOCK_SEQPACKET. Acceptă două argumente:
- sockfd este descriptorul socket-ului corect.
- backlog este un număr întreg, adică numărul de conexiuni stabilite care pot fi procesate în orice moment. Sistemul de operare îl stabilește, de obicei, egal cu valoarea maximă.
După acceptarea conexiunii, este eliminată din coadă. Dacă este reușit, 0 este returnat, -1 dacă apare o eroare.
accept () este folosit pentru a accepta o solicitare de conectare de la o gazdă la distanță. Acceptă următoarele argumente:
Funcția returnează un descriptor socket asociat conexiunii primite sau -1 dacă apare o eroare.
Parametri suplimentari pentru socluri
După crearea soclului, puteți seta parametri suplimentari pentru acesta. Iată câteva dintre ele:
- TCP_NODELAY dezactivează algoritmul Nagle (English Nagle's_algorithm)
- SO_KEEPALIVE include verificări periodice pentru prezența "semnelor de viață", dacă acestea sunt acceptate de sistemul de operare.
Blocuri și prize fără blocaj
Conectorii Berkeley pot funcționa în unul din cele două moduri: blocarea sau blocarea. Soclul de blocare nu readuce controlul până când nu trimite (sau nu primește) toate datele specificate pentru operație. Acest lucru este valabil numai pentru sistemele Linux. În alte sisteme, de exemplu în FreeBSD, este normal ca o priză de blocare să nu trimită toate datele. Aplicația trebuie să verifice valoarea returnată pentru a urmări câți octeți au fost trimise / primite și, în consecință, să trimită informațiile brute până în prezent [1]. Acest lucru poate duce la probleme dacă socket-ul continuă să "asculte": programul se poate suspenda, deoarece soclul așteaptă date care nu pot ajunge niciodată.
Un soclu este de obicei indicat de o funcție de blocare sau de blocare utilizând funcțiile fcntl () sau ioctl ().
Transfer de date
Pentru a transfera date, puteți utiliza funcțiile standard de citire / scriere a fișierelor de citire și scriere. dar există funcții speciale pentru transferul de date prin prize:
Este necesar de menționat faptul că atunci când se utilizează TCP (socket de tip SOCK_STREAM) este probabil să primească mai puține date decât au fost transferate, deoarece nu toate datele au fost transferate, așa că trebuie să aștepte, fie pentru recv întoarce 0 bytes, sau expune pavilion MSG_WAITALL funcții recv. care o va forța să aștepte sfârșitul transferului. Pentru alte tipuri de prize de pavilion nu schimbă nimic MSG_WAITALL (de exemplu, UDP întregul pachet = mesaj de ansamblu). Consultați și capitolul "Prize de blocare și blocare".
Eliberarea resurselor
Sistemul nu eliberează resursele alocate atunci când apelează socket (). până când apelați aproape (). Acest lucru este important mai ales dacă apelul connect () nu reușește și poate fi repetat. Fiecare apel socket () trebuie să aibă un apel aproape () în toate căile de execuție posibile. Trebuie să adăugați un fișier antet
Rezultatul apelului de sistem close () este doar un apel la interfață pentru a închide soclul, în loc să închidă socket-ul însuși. Aceasta este comanda pentru kernelul de a închide soclul. Uneori, pe partea de server, soclul poate intra în modul de așteptare TIME_WAIT timp de până la 4 minute. [2]
Exemplu client și server utilizând TCP
TCP implementează conceptul de conexiune. Procesul creează un soclu TCP prin apelarea funcției socket () cu parametrii PF INET sau PF_INET6. și SOCK_STREAM (Stream Socket) și IPPROTO_TCP.
Crearea celui mai simplu server TCP constă în următorii pași:
- Creați prize TCP prin apelarea funcției socket ().
- Legați un soclu la portul de ascultare apelând bind (). Înainte de a apela bind (), programatorul trebuie să declare structura sockaddr_in. curățați-l (folosind memset ()), apoi sin_family (PF_INET sau PF_INET6) și completați sin_port (ascultare port, pentru a indica într-o secvență de octeți). Conversia unui scurt int în ordinea octeților poate fi efectuată apelând funcția htons () (scurt pentru "de la gazdă la rețea").
- Pregătiți soclul pentru ascultarea conexiunilor (crearea unui soclu sonor) apelând ascultați ().
- Acceptați conexiunile primite prin apelul accept (). Aceasta blochează soclul până când recepționează o conexiune de intrare și apoi întoarce mânerul soclului pentru conexiunea recepționată. Descriptorul inițial rămâne descriptorul ascultat, iar acceptarea () poate fi apelată din nou pentru acest soclu în orice moment (în timp ce acesta este închis).
- O conexiune la o gazdă la distanță care poate fi creată folosind send () și recv () sau write () și read ().
- Închiderea finală a fiecărui soclu deschis, care nu mai este necesară, se realizează utilizând închide (). Trebuie remarcat faptul că, dacă au existat apeluri la furcă (). fiecare proces trebuie să închidă prizele cunoscute (kernel-ul urmărește numărul de procese care au un descriptor deschis) și, în plus, două procese nu ar trebui să utilizeze același soclu în același timp.
Crearea unui client TCP este după cum urmează:
Exemplu de client și server utilizând UDP
Codul poate crea un server UDP pe portul 7654 după cum urmează:
Această buclă infinită primește toate datagramele UDP care ajung la portul 7654 folosind recvfrom (). Funcția utilizează următorii parametri:
Definiția standardului de jure al interfeței socket, conținut în standardul POSIX. mai bine cunoscut sub numele de:
Vezi ce "Berkeley Sockets" în alte dicționare:
Socket (interfață software) - Acest termen are alte semnificații, vezi Socket. Socket-urile (locașul, soclul, conectorul în limba engleză) este numele interfeței software pentru furnizarea unui schimb de date între procese. Procesele cu un astfel de schimb pot fi executate ca ... ... Wikipedia
Programarea sarcinilor de rețea - (. Engleză de programare de rețea) În domeniul informatizării a conceptului de sarcini de programare de rețea, sau altfel cunoscut sub numele de rețea de programare, destul de similar cu conceptele de prize de programare și de programare client-server, ... ... Wikipedia
Unix soclu domeniu - (explozie soclu Unix) sau IPC soclu (priză de comunicare interprocese) schimb de date punct final, similar cu priza de Internet, dar care nu utilizează un protocol de rețea pentru comunicare (schimb de date). Este folosit în sistemele de operare, ... ... Wikipedia
Un socket brut este o interfață de programare a aplicațiilor (API), o versiune socket Berkeley care vă permite să colectați pachete TCP / IP monitorizând fiecare bit al antetului și trimițând pachete nestandard în rețea. Exemplu Crearea unui soclu. Cod în limba C. int i32SocketFD ... Wikipedia
UNIX - Arborele genealogic UNIX UNIX (citiți Unix) o familie de dispozitive portabile, multitasking și multiuser ... Wikipedia
UX - Arborele de familie UNIX al sistemelor UNIX (citiți Unix) un grup de sisteme de operare portabile, cu mai multe sarcini și cu mai mulți utilizatori. Primul sistem UNIX a fost dezvoltat în 1969 în divizia companiei Bell Labs AT T. De atunci, a fost creată ...
Unix - arbore genealogic al sistemelor UNIX UNIX (citește Unix) un grup de sisteme de operare portabile, multitasking și multi-utilizator. Primul sistem UNIX a fost dezvoltat în 1969 în divizia companiei Bell Labs AT T. De atunci, a fost creată ...
UNIX - arbore genealogic UNIX UNIX (citiți Unix) un grup de sisteme de operare portabile, multitasking și multi-utilizator. Primul sistem UNIX a fost dezvoltat în 1969 în divizia companiei Bell Labs AT T. De atunci, a fost creată ...
Unix - arbore genealogic UNIX UNIX (citiți Unix) un grup de sisteme de operare portabile, multitasking și multi-utilizator. Primul sistem UNIX a fost dezvoltat în 1969 în divizia companiei Bell Labs AT T. De atunci, a fost creată ...
Interfața stratului de transport - în designul rețelelor de calcul TLI (Interface Layer Transport) a fost un API de rețea, susținut de AT T UNIX System V Release 3 (SVR3) și Release 4 (SVR4). TLI a fost un dublu (dar în sistemul V) ... ... Wikipedia