
Envoyé par
bit_o
je réalise un programme qui permet d'envoyer un fichier depuis un serveur (machine qui émet) vers un client (machine qui reçoit).
Pour l'instant, ce que j'essaye d'envoyer c'est un fichier texte. Le serveur et le client sont bien connectés, mon problème réside dans le premier send() que je vais faire.
Ce send() doit envoyer la longueur de la chaine qui va etre transmise par la suite. Ce que je n'arrive pas à faire, c'est envoyer un long et le récupérer du coté client ..
Le principe est d'envoyer des séquences d'octets définies par une adresse et une longueur :
send (sock, data, length, 0);
On construit donc un tableau de unsigned char contenant les données à émettre. Si on souhaite transmettre une valeur binaire qui occupe plus que 8-bit, on utilise le format 'réseau' (MSB en tête) :
1 2 3 4 5 6 7 8 9 10 11 12
|
unsigned long val = 0xDEADBEEF;
unsigned char data[4];
printf ("%08X\n", val);
data[0] = (val >> (8 * 3)) & 0xFF; /* MSB */
data[1] = (val >> (8 * 2)) & 0xFF;
data[2] = (val >> (8 * 1)) & 0xFF;
data[3] = (val >> (8 * 0)) & 0xFF; /* LSB */
send (sock, data, sizeof data, 0); |
en réception, on fait l'opération inverse :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
unsigned char data[4];
int n = recv (sock, data, sizeof data, 0);
if (n > 0)
{
unsigned long val = 0;
val |= (data[0] << (8 * 3)); /* MSB */
val |= (data[1] << (8 * 2));
val |= (data[2] << (8 * 1));
val |= (data[3] << (8 * 0)); /* LSB */
printf ("%08X\n", val);
} |
Nota : ces opération sont portables (indépendantes de l'endianness, de la taille des types etc.) et inter-opérables entre machines différentes.
Partager