ci-dessous pour votre annoté plaisir:
// This is the number of IP string buffers.
#define IPTOSBUFFERS 12
char *iptos(u_long in)
{
// 12 buffers, each big enough to hold maximum-sized IP address
// and nul terminator.
static char output[IPTOSBUFFERS][3*4+3+1];
// Last buffer used.
static short which;
// Get uns. char pointer to IP address.
u_char *p;
p = (u_char *)∈
// Move to next string buffer, wrapping if necessary.
which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
// Output IP address by accessing individual unsigned chars in it.
_snprintf_s(output[which], sizeof(output[which]), sizeof(output[which]),
"%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
// Return the current buffer.
return output[which];
}
Cela fonctionne parce que la représentation d'une adresse IPv4 est une valeur 32 bits dans la mémoire et chacun des quatre segments occupe un octet chacun. Il est donc relativement simple de convertir l'adresse de l'entier 32 bits en un tableau à quatre caractères, puis d'utiliser ce tableau pour extraire les segments individuels. Ceci est, bien sûr, basé sur les types de données ayant des largeurs de bits spécifiques donc ce n'est pas portable.
La chose bizarre est la file d'attente circulaire 12-adresse IP. Peut-être que c'était ainsi que vous pourriez obtenir jusqu'à 12 adresses IP à la fois sans que les chaînes soient remplacées bien que je ne pense pas avoir jamais rencontré une situation où plus de deux (peut-être trois pour un serveur proxy ou pass-thru) requis en même temps. Je ne pense pas que ce soit pour la sécurité des threads puisque la modification à which
est intrinsèquement dangereuse dans un environnement threadé.
Qu'est-ce que vous ne comprenez pas? On dirait qu'il faut un long unsigned et renvoie la représentation de la chaîne ip, avec un pointeur qui pend, malheureusement. – WhirlWind
Quel est le u_long pour '172.16.48.1'? – user198729
172 * 256^3 + 16 * 256^2 + 48 * 256^1 + 1 – WhirlWind