Home » Articole » Articole » Calculatoare » Reţele de calculatoare » Interfaţa de Programare a Aplicaţiei » Date, sockeţi şi rutine de ordonare în reţelele de calculatoare

Date, sockeţi şi rutine de ordonare în reţelele de calculatoare

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()
calls, filled in other_app_addr,and put
23 octets of data into buffer */

retcode = sendto(sockfd, buffer, 23, 0,
(struct sockaddr *) &other_app_addr,
sizeof(other_app_addr))

Exemplu: folosind recvfrom()
char buffer[50];
struct sockaddr_in other_app_addr;
int nread, addrlen;

/* suppose we have done socket(), bind() */
nread = recvfrom(sockfd, buffer, 23, 0,
(struct sockaddr *) &other_app_addr, &addrlen))
 

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 */
    };
03-07

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
  • htonl
  • converteşte formatul gazdă 32-bit în nbo
  • ntohl
  • converteşte nbo în formatul gazdă 32-bit
  • htons
  • converteşte formatul gazdă 16-bit în nbo
  • ntos
  • converteşte nbo în formatul gazdă 16-bit

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *