Interfata Socket Berkeley implementata pe Windows

Informatiile urmatoare sunt luate din documentatia MicroSoft pentru dezvoltatorii de aplicatii Win32.

Bibliotecile winsock si winsock2 includ aceasta interfata pentru asigurarea compatibilitatii cu aplicatiile dezvoltate pe UNIX. 

Doua functii din interfata Berkeley n-au fost implementate de Windows Sockets; este vorba de functiile read() si write().

Alte doua functi au capatat alt nume in implementarea Windows; ioctl() a devenit ioctlsocket(), iar close() a devenit closesocket().

Funciile interfetei socket implementate in Windows sunt in ordine:

accept1 O cerere de conexiune este recunoscuta si se asociaza cu ea un socket creat pentru comunicarea cu clientul care a facut cererea de conectare. Socketul initial este adus din nou la starea de ascultare.
bind Atribuie o adresa locala unui socket fara adresa.
closesocket1 Inlatura un socket din tabelul de referinte la obiecte per-proces. Blocheaza socketul numai daca este setat SO_LINGER cu un timp de pauza pe un socket cu blocare.
connect1 Initiaza o conexiune la un socket specificat.
getpeername Intoarce numele corespondentului conectat la un socket specificat.
getsockname Intoarce adresa locala la care un socket este legat.
getsockopt Intoarce optiunile asociate cu un socket specificat.
htonl2 Converteste o marime pe 32 de biti de la formatul pentru pentru host la formatul pentru retea.
htons2 Converteste o marime pe 16 de biti de la formatul pentru pentru host la formatul pentru retea.
inet_addr2 Converteste un sir de caractere reprezentand un numar in notatia "." standard pentru Internet la o valoare de adresa Internet address value.
inet_ntoa2 Converteste o valoare de adresa Internet la un sir ASCII in notatia "." adica "a.b.c.d''.
ioctlsocket Asigura controlul socketurilor.
listen Asteapta cereri de conectare la un socket specificat.
ntohl2 Converteste o marime pe 32 de biti de la formatul pentru pentru retea la formatul pentru host.
ntohs2 Converteste o marime pe 16 de biti de la formatul pentru pentru retea la formatul pentru host.
recv1 Receptioneaza date de la un socket cu sau fara conexiune.
recvfrom1 Receptioneaza date atat de la un socket conectat cat si de la un socket neconectat.
select1 Asigura multiplexarea Intrare / iesire sincrona.
send1 Trimite date printr-un socket conectat.
sendto1 Trimite date atat la un socket conectat cat si la un socket neconectat.
setsockopt Seteaza optiuni asociate cu un socket specificat.
shutdown Inchide o parte a unei conexiuni  full-duplex.
socket Creeaza un capat de comunicare si intoarce un discriptor de socket.
WSAStartup Initializeaza utilizarea bibliotecii DLL de catre un proces.
WSACleanup Functia WSACleanup a Windows Sockets termina utilizarea DLL-ului Windows Sockets. Sintaxa ei este

int WSACleanup (void);

1 Functia poate produce blocare daca actioneaza asupra unui socket cu blocare.

2 Functia este pastrata pentru compatibilitate cu Windows Sockets 1.1, si trebuie folosita numai cu familia de adrese AF_INET.

Utilizarea socketurilor Windows cu un protocol orientat pe conexiune

Figura urmatoare prezinta apelurile tipice pentru socketuri pe care o aplicatie le poate folosi cu un protocol orientat pe conexiune.

Partea din stanga a diagramei reprezinta apelurile de functii facute de server, partea din dreapta reprezinta apelurile de functii ale clientului. Sagetile verticale reprezinta ordinea apelurilor, iar sagetile orizontale fluxul comunicatiei intre cele doua procese.

Apelurile serverului

Pentru implementarea unui server orientat pe conexiune sunt necesare, in ordine, urmatoarele apeluri de functii API.

  1. WSAStartup(). In Window Sockets aceasta functie trebuie apelata pentru initializarea utilizarii bibliotecii DLL asociate.
  2. socket(). Serverul creeaza un socket cu functia socket().
  3. bind(). Serverul inregistreaza (leaga) socketul la un port local.
  4. listen(). Functia listen cere socketului sa astepte cereri de conectare si sa confirme primirea acestora. Functia listen() trece socketul intr-o stare de asteptare pasiva.Un socket care sta in ascultare va trimite fiecarui solicitant un mesaj de confirmare ca serverul a receptionat cererea de conectare. Un socket in ascultare nu accepta de fapt cererea de conectare.
  5. accept(). Programul server va trebui sa foloseasca pentru aceasta functia accept().
  6. recv(). Aceasta functie se utilizeaza cu socketuri conectate sau socketuri legate fara conexiune si este utilizata pentru citirea datelor de intrare
  7. send().Functia send() se foloseste pentru a scrie date printr-un socket conectat.

Apelurile clientului

Pentru implementarea unui client orientat pe conexiune sunt necesare, in ordine, urmatoarele apeluri de functii API.

  1. WSAStartup(). In Window Sockets aceasta functie trebuie apelata pentru initializarea utilizarii bibliotecii DLL asociate.
  2. socket(). Clientul creeaza de asemenea un socket cu functia socket().
  3. connect(). Clientul nu este interesat de adresa locala de protocol si de acea nu foloseste functia bind. In schimb, clientul orientat pe conexiune initiaza conversatia in retea apeland functia connect.

Dupa ce serverul si clientul stabilesc conexiunea, comunicatia care urmeaza are loc prin intermediul functiilor recv() si send() de ambele parti. Totusi, clientul si serverul mai pot utiliza functiile sendto() si recvfrom().

Utilizarea socketului Windows cu un protocol fara conexiune

Figura urmatoare ilustreaza secventa tipica de apelurile pentru socketuri utilizate la protocoale fara conexiune.

Apelurile serverului

Programul server fara conexiune din figura de mai sus utilizeaza apelurile socket() si bind() in acelasi mod in care o face si un server orientat pe conexiune. Pentru preluarea datelor de la socket programul server fara conexiune apeleaza functia recvform(). Functia recvform() nu asteapta realizarea unei conexiuni. In schimb, raspunde oricaror solicitari care sosesc la portul la care s-a inregistrat cu functia bind(). Cand functia recvform() receptioneaza o datagrama de la socket, ea memoreaza adresa de retea a procesului care a trimis datagrama, precum si datagrama insasi.

De notat ca in cazul protocoalelor fara conexiune si clientul se poate lega (optional) la un port folosind functia bind().

Apelurile clientului

In esenta apelurile sunt aceleasi. Deosebirea intre client si server apare si aici din faptul ca dialogul este initiat tot de client prin cererea de serviciu pentru care foloseste functia sendto().

KITS

Cornel Mironel Niculae, 2004-2005
25-Mar-2008