Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

send/recv

Aceste două funcţii se folosesc pentru a transmite date prin sockeţi de tip stream sau sockeţi de tip datagramă conectaţi. Sintaxa pentru trimitere şi primire este asemănătoare. Pentru trimitere, se folosește funcția send():

#include <sys/types.h>
#include <sys/socket.h>

ssize_t send(int connfd, const void *buf, size_t len, int flags);

Note

Atenție la socket-ul pe care send îl primeste. Acesta este socket-ul returnat de accept de la un client. sockfd îl folosim doar pentru a primi conexiuni de la clienți.


  1. connfd este socketul căruia se dorește să se trimită date (fie este returnat de apelul socket(), fie de apelul accept()).
  2. buf este un pointer către adresa de memorie unde se găsesc datele ce se doresc a fi trimise,
  3. len reprezintă numărul de octeți din memorie începand de la adresa respectivă ce se vor trimite.
  4. flags reprezintă o combinație de flag-uri ce poate altera modul de transmitere al mesajului.

Functia întoarce numărul de octeți efectiv trimiși (acesta poate fi mai mic decât numărul care s-a precizat că se dorește a fi trimis, adică len). În caz de eroare, funcția returnează -1, setându-se corespunzător variabila globală errno.

Pentru recepție de date, se folosește funcția recv():

#include <sys/types.h>
#include <sys/socket.h>

ssize_t recv(int connfd, void *buf, size_t len, int flags);
  1. connfd reprezintă socketul de unde se citesc datele,
  2. buf reprezintă un pointer către o adresă din memorie unde se vor scrie octeții citiți,
  3. len reprezintă numărul maxim de octeți ce se vor citi.

Funcția recv() întoarce numărul de octeți efectiv citiți în buf sau -1 în caz de eroare.

Observații:

  1. recv() poate întoarce și 0, acest lucru însemnând că entitatea cu care se comunică a închis conexiunea
  2. pentru scrierea/citirea în/din sockeți TCP, se pot folosi cu succes și functiile write() și read (foarte asemănătoare cu send() și recv()), mai puțin câmpul flags, care va fi setat la valoarea 0