MX kaydında (gethostbyname gibi) sorgulayabileceğimiz linux üzerinde C dilinde herhangi bir işlev var mı.C linux'da MX kaydı sorgulama
cevap
-lresolv
(BIND'nin libresolv
) ile bağlantı.
#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;
}
Bu programı çalıştırmak için harici kütüphaneye ihtiyacımız var mı? – avd
Daha önce de belirttiğim gibi, bu aslında BIND projesinden gelen libresolv'e ihtiyaç duyar (ancak glibc'nin bir kopyası vardır). – ephemient
Bu kitaplık nasıl kurulur? Herhangi bir harici kütüphane olmadan MX sorgusu yapıyor muyuz? – avd
Sadece yukarıdaki cevaba eklemek istiyorum. Derleme hataları alıyorum. Aramadan sonra, nasıl derleneceğime dair bir forum buldum. İlk Kullanım ana işlevi
main(){
char *mxs[10];
int a;
printf("%d\n",a=resolvmx("gmail.com",mxs,10));
printf("%s\n",mxs[a-1]);
}
(gmail.com diyelim için) ve daha sonra gibi bu tekrarlayanı kopyası
gcc <pname.c> /usr/lib/libresolv.a (instead of gcc pname.c -lresolv)
Eğer/usr/lib/libresolv.so' eksik iseniz, 'libresolv.a'ya doğrudan işaret etmek yerine' -Wl, -Bstatic -lresolv' kullanmanız gerekir. – ephemient
Ancak yukarıdaki seçenekler çalışmıyor – avd
Kitaplığın yolunu belirtmeniz gerekmez. Muhtemelen gördüğünüz problem, herhangi bir statik versiyonun bulunmadığı '-lresolv' sonrası kütüphanelerin bağlanmasıdır. Yani bunu yerine yapabilirsiniz: -Wl, -statik -lresolv -Wl, -Bodinamik, ya da daha özlü: '-statik -lresolv -dynamic'. – jxh
olarak derleyin. –
PLease bunu kaldırmaz. Diğer gönderinin tam cevapları yok. Bu tamamen sorunu düzeltir. – avd