|
|
|
|
@ -35,84 +35,6 @@ std::vector<std::string> stringTokenizer(const std::string &s)
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int getAllIPV4Addresses(const char * name, unsigned short port, unsigned int * num, struct sockaddr_in * addr, unsigned int max_addr)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
struct addrinfo hints;
|
|
|
|
|
struct addrinfo * res;
|
|
|
|
|
|
|
|
|
|
memset(&hints, 0x00, sizeof(struct addrinfo));
|
|
|
|
|
hints.ai_family = AF_INET;
|
|
|
|
|
hints.ai_socktype = SOCK_STREAM;
|
|
|
|
|
|
|
|
|
|
int r = getaddrinfo(name, NULL, &hints, &res);
|
|
|
|
|
|
|
|
|
|
if (r == 0) {
|
|
|
|
|
struct addrinfo * rp;
|
|
|
|
|
unsigned int numAddr = 0;
|
|
|
|
|
|
|
|
|
|
for (rp = res; rp != NULL; rp = rp->ai_next) {
|
|
|
|
|
if (rp->ai_family == AF_INET)
|
|
|
|
|
numAddr ++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (numAddr > 0) {
|
|
|
|
|
if (numAddr > max_addr)
|
|
|
|
|
numAddr = max_addr;
|
|
|
|
|
|
|
|
|
|
int * shuffle = new int[numAddr];
|
|
|
|
|
|
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
|
|
for (i=0; i < numAddr; i++)
|
|
|
|
|
shuffle[i] = i;
|
|
|
|
|
|
|
|
|
|
for (i=0; i < (numAddr - 1); i++) {
|
|
|
|
|
if (rand() & 1) {
|
|
|
|
|
int tmp;
|
|
|
|
|
tmp = shuffle[i];
|
|
|
|
|
shuffle[i] = shuffle[i+1];
|
|
|
|
|
shuffle[i+1] = tmp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i=(numAddr - 1); i > 0; i--) {
|
|
|
|
|
if (rand() & 1) {
|
|
|
|
|
int tmp;
|
|
|
|
|
tmp = shuffle[i];
|
|
|
|
|
shuffle[i] = shuffle[i-1];
|
|
|
|
|
shuffle[i-1] = tmp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (rp = res, i=0 ; (rp != NULL) && (i < numAddr); rp = rp->ai_next) {
|
|
|
|
|
if (rp->ai_family == AF_INET) {
|
|
|
|
|
memcpy( addr+shuffle[i], rp->ai_addr, sizeof (struct sockaddr_in) );
|
|
|
|
|
|
|
|
|
|
addr[shuffle[i]].sin_port = htons(port);
|
|
|
|
|
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
delete[] shuffle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*num = numAddr;
|
|
|
|
|
|
|
|
|
|
freeaddrinfo(res);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
printf("getaddrinfo: %s\n", gai_strerror(r));
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void safeStringCopy (char *dest, const char *src, unsigned int buf_size)
|
|
|
|
|
{
|
|
|
|
|
unsigned int i = 0;
|
|
|
|
|
|