sendto
Functia sendto() trimite date la o adresa specificata.
int sendto (
SOCKET s,
const char FAR * buf,
int len,
int flags,
const struct sockaddr FAR * to,
int tolen
);
unde:
s - [in] este un descriptor ce identifica un
socket.buf - [in] este un pointer catre un buffer pentru datele
de transmis.len - [in] lungimea bufferului buf.flags - [in] specifica modul in care se face apelul.to - [in] un pointer optional
catre un buffer care memoreaza adresa destinatie.tolen - [in] dimensiunea adresei
memorata in structura to.
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:
MSG_DONTROUTE Precizeaza ca datele nu trebuiesc rutate. Un
furnizor de servicii Windows Sockets poate ignora (optional) acest flag.MSG_OOB Trimite datele out-of-band (numai
pentru socketuri orientate
pe streamuri precum SOCK_STREAM). Vezi sectiunea Date Out-Of-Band
pentru detalii suplimentare.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