recvfrom
Functia recvfrom() primeste date de la un socket si memoreaza adresa
sursei.
int recvfrom (
SOCKET s,
char FAR* buf,
int len,
int flags,
struct sockaddr FAR* from,
int FAR* fromlen
);
unde:
s - [in] este un descriptor ce identifica un
socket legat.buf - [out] este un pointer catre un buffer pentru datele care vin.len - [in] lungimea bufferului buf.flags - [in] specifica modul in care se face apelul.from - [out] un pointer optional
catre un buffer care va memora dupa revenire adresa sursei.fromlen - [in/out] un pointer
optional catre marimea bufferului from.Aceasta functie se foloseste pentru citirea datelor provenind de la un socket (ce poate fi si conectat) si captureaza adresa de unde datele au fost trimise.
Pentru socketuri orientate pe stream, precum tipul SOCK_STREAM, se
returneaza atata informatie cat este curent disponibila pana la dimensiunea
bufferului alocat. Daca socketul a fost configurat pentru receptia in-line a datelor
out-of-band (care se obtine folosind optiunea de socket SO_OOBINLINE)
si datele out-of-band nu sunt citite, numai datele out-of-band vor fi returnate.
Aplicatia poate folosi functia ioctlsocket() cu parametrul SIOCATMARK
pentru a determina daca mai sunt date out-of-band de citit.
Parametrii from si fromlen sunt ignorati pentru
socketuri orientate pe conexiune.
Pentru socketuri orientate pe mesaj, datele sunt extrase din primul mesaj din
coada de asteptare, pana la dimensiunea bufferului alocat. Daca datagrama sau
mesajul este mai mare decat bufferul alocat atunci bufferul este umplut cu prima
parte a datagramei si functia recvfrom() genereaza o eroare WSAEMSGSIZE.
Pentru protocoale nesigure (precum UDP, spre exemplu) excesul de date se
pierde.
Daca parametrul from este nenul si socketul nu este orientat pe
conexiune (spre exemplu, tipul SOCK_DGRAM), adresa de retea a
corespondentului este copiata in structura corespunzatoare de tip sockaddr.
Valoarea pointata de catre fromlen este initializata cu
dimensiunea acestei structuri si este modificata la intorcere pentru a preciza
dimensiunea reala a adresei memorata acolo.
Daca nu sunt disponibile date la socket, apelul functiei recvfrom
asteapta ca datele sa soseasca (blocand aplicatia) daca socketul este cu
blocare. In caz contrar, o valoare SOCKET_ERROR este returnata cu
un cod de eroare WSAEWOULDBLOCK. Functiile select, WSAAsyncSelect,
sau WSAEventSelect pot fi utilizate pentru a determina cand daca
mai au sosit date.
Daca socketul este orientat pe conexiune si corespondentul a inchis conexiunea
"cu gratie", functia recvfrom va completa cu zerouri
octetii de date deja receptionati. Daca conexiunea a fost resetata functia recvfrom
se va intoarce cu un cod de eroare WSAECONNRESET.
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_PEEK extrage datele ce au sosit fara a fi sterse din
coada de asteptare.MSG_OOB Proceseaza datele out-of-band. Vezi sectiunea Date
Out-Of-Band pentru detalii suplimentare.
Daca nu apar erori, functia recvfrom() intoarce numarul de octeti
receptionati. Daca conexiunea a fost inchisa "gratios", valoarea
returnata este zero. 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