Bonjour a tous,

Je souhaite écrire un serveur tcp asynchrone, ce serveur doit parfois recevoir des données.
Je ne connaît pas a l'avance la taille des données a recevoir, ce qui n'est pas forcément un problème car il reçoit en premier lieu un entier d'un type déterminé (et dont la taille ne varie pas) qui contient la taille des données qui vont suivre.

Je voudrait que tout cela soit asynchrone, donc un petit coup de fcntl et hop le descripteur est non bloquant.
L'idée serait de regrouper tout les read qui vont suivre en un seul, on peut faire ça avec readv:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
Si j’écris ce code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
size_t size = 0;
char* data = NULL;
 
data = malloc(size * sizeof(char));
 
struct iovec v[2];
 
v[0].iov_base = &size;
v[0].iov_len = sizeof(size_t);
v[1].iov_base = data;
v[1].iov_len = *(v[0].iov_base) * sizeof(char);
 
readv(socket, v, 2);
Je sait que ça ne peut pas fonctionner entre deux machines little et big endian, 32 et 64 bits, pour la simplicité je n'est pas mis les macros d'usage pour ces transformations (de toute façon il n'y a pas les headers..).

L'appel système va il utiliser la valeur size qu'il a récupéré dans la première lecture pour faire la seconde?
A moins qu'il recopie le tableau au départ auquel cas la seconde lecture sera de 0 octets.


PS: La plateforme c'est Linux et du récent..