Transmiterea şi recepţia datelor
Datele transmise/recepţionate folosind apelurile i/o ale sistemului standard UNIX sau apelurile sistemului specific reţelei
Apelul sistemului | Dispoyitiv | Buferare | Opţiuni | Se specifică legătura? |
read()/write() | oricare i/o | unică | N | N |
readv()/writev() | oricare i/o | scatter/gather | N | N |
recv()/send() | socket | unică | D | N |
recvfrom()/sendto() | socket | unică | D | D |
recvmsg()/sendmsg() | socket | scatter/gather | D | D |
Transmisia via un socket: sendto()
int sendto (int sockfd, char *buff, int bufflen, int flags, struct sockaddr *toaddrptr, int addresslen)
sockfd este valoarea de retur asignată variabil a socket()
*buff este un set de locaţii de memorie consecutive păstrând mesajul pentru a fi transmis
bufflen este numărul de octets care trebuiesc transmişi.
Indicatoarele (flags) pot fi folosite pentru a specifica opţiunile. Întotdeauna 0 pentru noi.
*toaddrptr este structura de adresa pentru sockaddr_in care păstrează informaţiile despre adresele de destinaţie. Trebuie sa ai permisiunea pentru a putea scrie sockaddr.
addresslen easte dimensiunea structurii adresei.
Codul de retur OK NU implică date corect livrate, numai corect transmise
Citirea/scrierea sockeţilor: exemple
Exemplu: folosind sendto() char buffer[50]; struct sockaddr_in other_app_addr; int retcode /* suppose we have done socket() and bind() retcode = sendto(sockfd, buffer, 23, 0, |
Exemplu: folosind recvfrom() char buffer[50]; struct sockaddr_in other_app_addr; int nread, addrlen; /* suppose we have done socket(), bind() */ |
Citirea de la un socket: recvfrom()
int recvfrom (int sockfd, char *buff, int bufflen,
int flags, struct sockaddr *fromaddrptr,
int *addresslen)
sockfd este valoarea de retur asignata a socket()
*buff este un set de locaţii de memorie consecutive în care sunt primite datele pentru a fi scrise
bufflen este numărul de octets de citit
Indicatoarele (flags) pot fi folosite pentru opţiuni specifice. Întotdeauna sunt 0 pentru noi.
*fromaddrptr este structura de adresă pentru isockaddr_in conţinând informaţii despre adresa socketului care transmite aceste date. Este o valoare returnată
addresslen este dimensiunea structurii adresei. Este o valoare returnată.
recvfrom() returnează octeţii de număr primiţi în prezent.
Scatter-ul citeşte şi gather-ul scrie
Folosite pentru a citi/scrie în/din multiple bufere ne-adiacente
writev(int sd, struct iovec iov[], int iovcount);
readv(int sd, struct iovec iov[], int iovcount);
struct iovec{
caddr_t iov_base; /* starting addr of this buffer */
int iov_len; /* num. octets in this buffer */
};
Rutine de ordonare a octeţilor
Rutinele de ordonare a octeţilor convertesc în/din numere întregi de 16 şi 32 bit din/în „numere de ordine a octeţilor în reţea”.
-
computere diferite pot stoca octeţi ai numerelor întregi în diferite moduri de ordonare în memorie
-
reprezentarea internă a lui 2^{24}
-
ordinea octeţilor în reţea este cu numerele mari la final
-
cantităţile întregi (precum informaţiile de adresare) trebuie să fie explicit convertite în/din ordinea octeţilor în reţea (network octet order (nbo)).
Numerele mari la final (M6800, IBM370) | |||
MSB |
LSB |
||
00000001 | 00000000 | 00000000 | 00000000 |
x | x + 1 | x + 2 | x + 3 |
Numerele mici la final (80×86, VAX) | |||
00000000 | 00000000 | 00000000 | 00000001 |
x | x + 1 | x + 2 | x + 3 |
Numele funcţiei | Acţiunea |
|
|
|
|
|
|
|
|
Lasă un răspuns