Обратный вызов C-Ares не получает аргумент из запроса
Я использую библиотеку c-ares для выполнения поиска DNS на множестве доменов, хранящихся в файле. Что-то вроде этого.
char *line = NULL;
while ((read = getline(&line, &len, fp)) != -1) {
if (line && line[strlen(line)-1]=='\n') line[strlen(line)-1]=0;
printf("Sending %s\n", line);
ares_query(channel, line, ns_c_in, ns_t_mx, callback, line);
}
Последний параметр функции ares_query имеет тип void *arg, который просто передается обратно в функцию обратного вызова. Подробности здесь -
typedef void (*ares_callback)(void *arg, int status, int timeouts, unsigned char *abuf, int alen)
void ares_query(ares_channel channel, const char *name, int dnsclass, int type, ares_callback callback, void *arg)
Вышеуказанный вызов ares_query, похоже, не проходит "строку", и я получаю переменную NULL в обратном вызове. Тем не менее, когда я называю это с таким литералом, это, кажется, передать аргумент.
ares_query(channel, line, ns_c_in, ns_t_mx, callback, "HELLO");
В чем разница между двумя подходами? Почему первый метод не работает?
2 ответа
Решение
Я думаю, что вы должны выделить память для переменной, переданной указателю void:
char *line;
line = malloc(stringLength*sizeof(char));
Я фактически выделил память для новой переменной, скопировал в нее содержимое строки и передал ее, похоже, теперь это работает.
arg = (char*) malloc(strlen(line) * sizeof(char));
strcpy(arg, line);
ares_query(channel, line, ns_c_in, ns_t_mx, callback, arg);