Functia sendto

Functia sendto() trimite date la o adresa specificata.

Sintaxa

int sendto (

SOCKET s, 
const char FAR * buf, 
int len, 
int flags, 
const struct sockaddr FAR * to, 
int tolen 
);

unde:

Functia sendto() se foloseste pentru a scrie date la un socket. Pentru socketuri orientate pe mesaj trebuie avut grija  sa nu se depaseasca dimensiunea maxima a pachetului permisa de retea, ce poate fi obtinuta preluand valoarea optiunii de socket SO_MAX_MSG_SIZE. Daca datele sunt prea lungi pentru a fi suportate automat de protocolul de transport este returnata eroarea WSAEMSGSIZE si datele nu sunt transmise.

Parametru to poate fi orice adresa valida din familia de adrese a socketului, inclusiv o adresa broadcast sau orice adresa multicast. Pentru a trimite unei adrese broadcast, o aplicatie trebuie sa seteze folosind functia setsockopt() optiunea SO_BROADCAST. In caz contrar, functia sendto() se va reintoarce cu un cod de eroare WSAEACCES. Pentru TCP/IP, o aplicatie poate trimite la orice adresa multicast (fara sa devina un membru al grupului).

Daca socketul este nelegat, o valoare unica este atribuita de catre sistem partii locale a asociatiei si socketul este marcat ca legat. In aceasta situatie, o aplicatie poate folosi functia getsockname() pentru a determina numele local al socketului.

De retinut ca indeplinirea cu succes a functiei sendto() nu indica ca datele au fost livrate cu succes.

Functia sendto() se foloseste de regula pentru un socket fara conexiune pentru a trimite datagrame unui corespondent specificat prin parametrul to. In cazul unui socket orientat pe conexiune parametrii to si tolen sunt ignorati. In acest caz functia sendto() este echivalenta cu functia send().

Pentru socketuri ce folosesc protocolul IP:

Pentru a trimite un broadcast (numai pentru tipul SOCK_DGRAM), adresa din parametrul to trebuie construita folosind adresa IP speciala INADDR_BROADCAST (definita in WINSOCK2.H) impreuna cu numarul de port dorit. In general nu este indicat ca o datagrama broadcast sa depaseasca dimensiunea la care apare fragmentarea, ceea ce inseamna ca portiunea de date a datagramei (fara antete) nu trebuie sa depaseasca 512 octeti.

Daca nu mai exista spatiu pentru buffer in sistemul de transport pentru a memora datele de transmis, functia sendto() se va bloca (cu exceptia cazului cand a fost trecut in modul fara blocare). Pe socketuri orientate pe stream fara blocare, numarul de octeti scrisi pot fi intre 1 si lungimea necesara, depinzand de resursele de memorare disponibile la ambele capete ale conexiunii. Un apel al unei dintre functiile select(), WSAAsyncSelect() sau WSAEventSelect() poate fi folosit pentru a trimite mai multe date.

Apelul functiei sendto() cu o valoare zero a parametrului len este legal si, in acest caz, functia sendto() va intoarce zero drept valoare valida. Pentru socketuri orientate pe mesaj, o datagrama cu lungimea zero va fi trimisa.

Parametrul flags poate fi folosit pentru a influenta comportarea functiei dincolo de optiunile specificate pentru socketul asociat. Adica, semnificatia acestei functii este determinata atat de optiunile de socket cat si de parametrul flags.

Parametrul flags este construit prin setarea unor biti ai intregului flags putand fi setati mai multi biti simultan folosind operatorul SAU la nivel de bit, in construirea acestui parametru.

 Pentru parametrul flags sunt definite urmatoarele valori constante:

Valoare returnata

Daca nu apar erori, functia sendto() intoarce numarul de octeti tansmisi (De retinut ca acest numar poate fi mai mic decat cel specificat de parametrul len). In caz contrar, este returnata o valoare  SOCKET_ERROR si un cod de eroare specifica poate fi obtinut apeland functia WSAGetLastError().

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