Functia bind

Functia bind asociaza o adresa locala cu un socket.

Sintaxa

int bind (

SOCKET s, 
const struct sockaddr FAR* name, 
int namelen 
);

unde:

    struct sockaddr {
    u_short sa_family;
    char sa_data[14];
    };

   
In afara campului sa_family,  continutul sockaddr este exprimat in ordinea octetilor de retea.

    Aceasta functie este folosita atat pentru socketuri orientate pe conexiune cat si la socketuri fara conexiune. La socketurile orientate pe conexiune functia bind este apelata inaintea functiei listen(). Atunci cand un socket este creata cu functia socket, exita un spatiu pentru name in campul rezervat numelui (in familia de adrese), dar nu are asignata nici o adresa. Functia bind stabileste asocierea locala a sochetului atribuindu-i astfel un "nume" local unui socket "fara nume".

Spre exemplu, in familia de adrese Internet, un nume consta din trei parti: familia de adrese, adresa hostului si un numar de port care identifica aplicatia. In Windows Sockets 2, parametrul name nu este strict interpretat ca un pointer catre o structura sockaddr. Este convertita la aceasta structura pentru compatibilitate cu Windows Sockets (versiunea mai veche). Furnizorii de servicii sunt liberi sa priveasca aceasta structura ca un bloc de memorie de lungime namelen. Primii doi octeti din acest bloc (ce corespund lui sa_family  in declararea structurii sockaddr) trebuie sa contina familia de adrese cu care a fost creat socketul. In caz contrar, va apare o eroare WSAEFAULT.

Daca unei aplicatii nu-i pasa ce adresa locala ii este atribuita, ea poate specifica valoarea constanta ADDR_ANY in campul sa_data. Aceasta permite furnizorului de servicii sa foloseasca orice adresa de retea ar fi potrivita, simplificand potential programarea pe calculatoare host mutihomed (adica, acelea care au mai mult de o interfata de retea si implicit mai mult de o adresa). Pentru TCP/IP, daca portul este specificat ca 0, furnizorul de servicii va atribui un port unic pentru aplicatie cu o valoare intre 1024 si  5000. Aplicatia poate folosi functia getsockname dupa bind pentru a afla adresa si portul care i-au fost asignate, dar nu daca daca adresa de Internet este egala cu INADDR_ANY, functia getsockname nu va putea sa furnizeze o adresa pana cand nu este conectat socketul, deoarece mai multe adrese pot fi valide daca hostul este multihomed.

Valoarea returnata

Dac nu apare nici o eroare, bind intoarce zero. In caz de eroare,  ea intoarce SOCKET_ERROR (in cazul Windows, un cod de eroare specific poate fi aflat apeland functia WSAGetLastError)

Cornel Mironel Niculae, 2004-2005
13-Nov-2004