Аннотировано ниже для вашего удовольствия:
// 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];
}
Это работает, потому что представление адреса IPv4 является 32-битным значением в памяти, и каждый из четырех сегментов занимает один октет каждый. Поэтому относительно просто преобразовать адрес 32-разрядного целого в массив из четырех символов, а затем использовать этот массив для извлечения отдельных сегментов. Это, конечно, основано на типах данных, имеющих определенную битовую ширину, так что это не так переносимо.
Странная вещь - круговая очередь с 12 IP-адресами. Возможно, так можно было получить до 12 IP-адресов за раз без перезаписи строк, хотя я не думаю, что когда-либо сталкивался с ситуацией, когда было больше двух (может быть, три для прокси или сквозного сервера) требуется в то же время. Я не думаю, что это для безопасности потоков, так как модификация which
опасна в многопоточной среде.