Czy w C na Linuksie jest jakaś funkcja, za pomocą której możemy zapytać o rekord MX (np. Gethostbyname).?Wywoływanie rekordów MX w języku C linux
Odpowiedz
Łącze z -lresolv
(BIND's libresolv
).
#include <arpa/inet.h>
#include <resolv.h>
#include <string.h>
int resolvmx(const char *name, char **mxs, int limit) {
unsigned char response[NS_PACKETSZ]; /* big enough, right? */
ns_msg handle;
ns_rr rr;
int mx_index, ns_index, len;
char dispbuf[4096];
if ((len = res_search(name, C_IN, T_MX, response, sizeof(response))) < 0) {
/* WARN: res_search failed */
return -1;
}
if (ns_initparse(response, len, &handle) < 0) {
/* WARN: ns_initparse failed */
return 0;
}
len = ns_msg_count(handle, ns_s_an);
if (len < 0)
return 0;
for (mx_index = 0, ns_index = 0;
mx_index < limit && ns_index < len;
ns_index++) {
if (ns_parserr(&handle, ns_s_an, ns_index, &rr)) {
/* WARN: ns_parserr failed */
continue;
}
ns_sprintrr (&handle, &rr, NULL, NULL, dispbuf, sizeof (dispbuf));
if (ns_rr_class(rr) == ns_c_in && ns_rr_type(rr) == ns_t_mx) {
char mxname[MAXDNAME];
dn_expand(ns_msg_base(handle), ns_msg_base(handle) + ns_msg_size(handle), ns_rr_rdata(rr) + NS_INT16SZ, mxname, sizeof(mxname));
mxs[mx_index++] = strdup(mxname);
}
}
return mx_index;
}
Czy potrzebujemy jakiejś zewnętrznej biblioteki do uruchomienia tego programu? – avd
Jak już wspomniałem: to wymaga 'libresolv', który pierwotnie pochodzi z projektu BIND (ale glibc ma kopię). – ephemient
Jak zainstalować tę bibliotekę? Czy możemy wykonać zapytanie MX bez biblioteki zewnętrznej? – avd
Chcę tylko dodać do powyższej odpowiedzi. Otrzymywałem błędy kompilacji. Po przeszukaniu znalazłem się na jednym forum, jak się kompilować. Pierwsze użycie jako główną funkcją (na powiedzmy gmail.com)
main(){
char *mxs[10];
int a;
printf("%d\n",a=resolvmx("gmail.com",mxs,10));
printf("%s\n",mxs[a-1]);
}
a następnie skompilować go jako
gcc <pname.c> /usr/lib/libresolv.a (instead of gcc pname.c -lresolv)
Jeśli brakuje '/ usr/lib/libresolv.so', nadal powinieneś używać' -Wl, -Bstatic -lresolv' zamiast wskazywać bezpośrednio na 'libresolv.a'. – ephemient
, ale powyższe opcje nie działają – avd
Nie musisz podawać ścieżki do biblioteki. Problem, który prawdopodobnie widzisz, polega na tym, że istnieją biblioteki połączone po '-lresolv', dla których nie ma dostępnych wersji statycznych. Możesz więc zrobić to zamiast: '-Wl, -Bstatic -lresolv -Wl, -Bdynamic' lub bardziej zwięźle:' -static -lresolv -dynamic'. – jxh
- 1. Wywoływanie System.Delegate obiekt klasy w języku C#
- 2. Wywoływanie Pythona IDLE w systemie Linux
- 3. Kategoryzacja rekordów w języku Java
- 4. Wywoływanie zewnętrznych funkcji szablonu C++ w języku Cython
- 5. C# w środowisku linux
- 6. Wywoływanie sconów ze skryptu w języku Python
- 7. Wywoływanie C# dll w vbscript
- 8. Nadpisywanie metody C++ w lua i wywoływanie jej w języku C++
- 9. Używanie rekordów MX do przekazywania wiadomości e-mail do innej domeny
- 10. Wywoływanie PowerShell z C#
- 11. Klawisze multimedialne w języku Python (Linux)
- 12. Jaka jest najlepsza praktyka w tworzeniu narzędzia wiersza polecenia unix/linux w języku C/C++?
- 13. wywoływanie funkcji złożenia z c
- 14. Wywoływanie C# dll z Java
- 15. Wywoływanie cmdlets powershell z C#
- 16. Wywoływanie metody o nazwie "ciąg" w środowisku wykonawczym w języku Java i C
- 17. Wywoływanie C funkcja/podprogram w kodzie Fortran
- 18. C++ 11: Wywoływanie C funkcja ++ okresowo
- 19. Zmienna właściwości w języku C++
- 20. Zmienne środowiskowe w języku Python w systemie Linux
- 21. Co to jest wywoływanie metod wirtualnych w języku Java?
- 22. C/C++ Linux GDB API
- 23. `PROCESSENTRY32W` w języku C#?
- 24. DateTime W języku C#
- 25. Safehandle w języku C#
- 26. SetWindowsHookEx w języku C#
- 27. Jak połączyć się z bazą danych i zapętlić zestaw rekordów w języku C#?
- 28. Eliksir - wywoływanie/wywoływanie makr - UndefinedFunctionError
- 29. C++ polecenia Linux
- 30. timerów Linux c
To duplikat duplikat. –
Proszę go nie usuwać. Inne posty nie zawierają pełnych odpowiedzi. To całkowicie rozwiązuje problem. – avd