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.
connfdeste socketul căruia se dorește să se trimită date (fie este returnat de apelulsocket(), fie de apelulaccept()).bufeste un pointer către adresa de memorie unde se găsesc datele ce se doresc a fi trimise,lenreprezintă numărul de octeți din memorie începand de la adresa respectivă ce se vor trimite.flagsreprezintă 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);
connfdreprezintă socketul de unde se citesc datele,bufreprezintă un pointer către o adresă din memorie unde se vor scrie octeții citiți,lenreprezintă 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:
recv()poate întoarce și 0, acest lucru însemnând că entitatea cu care se comunică a închis conexiunea- pentru scrierea/citirea în/din sockeți TCP, se pot folosi cu succes și functiile
write()șiread(foarte asemănătoare cusend()șirecv()), mai puțin câmpulflags, care va fi setat la valoarea 0