Functia recvfrom

Functia recvfrom() primeste date de la un socket si memoreaza adresa sursei.

Sintaxa

int recvfrom (

SOCKET s, 
char FAR* buf, 
int len, 
int flags, 
struct sockaddr FAR* from, 
int FAR* fromlen 
);

unde:

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:

Valoare returnata

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