Я уверен, что это из-за глупой ошибки, но я часами отлаживал и не мог решить проблему.
В моей программе есть функция, которая возвращает адресданный домен.Он вызывает getaddrinfo, копирует адрес в новую динамически присваиваемую переменную, устанавливает его указатель в структуру hostent и возвращает его.Тем не менее, возвращенный адрес был неверным.После некоторой отладки я понял, что его значение неожиданно меняется в некоторой точке кода.
Я сделал пример программы с соответствующей частью в этом выпуске:
#include <iostream>
#include <string.h>
#include <string>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <stdlib.h>
using namespace std;
typedef unsigned long int longip_t;
int main(int argc, char** argv) {
struct addrinfo hints, *res;
struct hostent *final = new hostent;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
getaddrinfo("automation.whatismyip.com", "80", &hints, &res);
cout << inet_ntoa(((sockaddr_in*)res->ai_addr)->sin_addr) << endl;
in_addr *addr = new in_addr;
memcpy((void*)addr, (void*)(&((sockaddr_in*)res->ai_addr)->sin_addr), sizeof(in_addr));
cout << inet_ntoa(*addr) << endl;
final->h_addr_list = (char**)addr;
cout << inet_ntoa(*addr) << endl;
final->h_addr = (char*)addr; // At this point the value of addr changes
cout << inet_ntoa(*addr) << endl;
cout << inet_ntoa(*(in_addr*)final->h_addr_list) << endl;
exit(0);
}
Вывод, который я получаю:
72.233.89.195
72.233.89.195
72.233.89.195
48.116.218.9
48.116.218.9
Первые три IP-адреса верны, но я получаю разные значения для последних двух IP-адресов при каждом запуске программы.Похоже, что значение addr изменяется после установки его указателя на структуру hostent.