Обратный вызов 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);
Другие вопросы по тегам