Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C-linux中查询MX记录_C_Linux_Smtp_Dns - Fatal编程技术网

在C-linux中查询MX记录

在C-linux中查询MX记录,c,linux,smtp,dns,C,Linux,Smtp,Dns,linux上的C中是否有任何函数可以用来查询MX记录(如gethostbyname)。链接-lresolv(BIND的libresolv) #包括 #包括 #包括 int resolvmx(常量字符*名称,字符**mx,int限制){ 无符号字符响应[NS_PACKETSZ];/*足够大,对吗*/ ns_味精手柄; ns_rr; intmx_指数,ns_指数,len; char dispbuf[4096]; if((len=res_search(name,C_IN,T_MX,response,s

linux上的C中是否有任何函数可以用来查询MX记录(如gethostbyname)。

链接
-lresolv
(BIND的
libresolv

#包括
#包括
#包括
int resolvmx(常量字符*名称,字符**mx,int限制){
无符号字符响应[NS_PACKETSZ];/*足够大,对吗*/
ns_味精手柄;
ns_rr;
intmx_指数,ns_指数,len;
char dispbuf[4096];
if((len=res_search(name,C_IN,T_MX,response,sizeof(response)))<0){
/*警告:res\u搜索失败*/
返回-1;
}
if(ns_initparse(response、len和handle)<0){
/*警告:ns_initparse失败*/
返回0;
}
len=ns_msg_计数(句柄,ns_s_an);
if(len<0)
返回0;
对于(mx_指数=0,ns_指数=0;
mx_指数<极限和ns_指数<长度;
ns_索引++){
if(ns_parserr(&handle,ns_s_an,ns_index,&rr)){
/*警告:ns_parserr失败*/
继续;
}
ns_sprintrr(&handle,&rr,NULL,NULL,dispbuf,sizeof(dispbuf));
如果(ns_rr_类(rr)=ns_c_in&&ns_rr_类型(rr)==ns_t_mx){
字符mxname[MAXDNAME];
dn_扩展(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);
}
}
返回mx_索引;
}

我只想补充上述答案。我遇到了编译错误。搜索之后,我参加了一个关于如何编译的论坛。首先使用main函数作为(比如gmail.com)

然后将其编译为

gcc <pname.c> /usr/lib/libresolv.a   (instead of gcc pname.c -lresolv)
gcc/usr/lib/libresolv.a(代替gcc pname.c-lresolv)

这是一个副本的副本。请不要删除此副本。其他帖子没有完整的答案。这个完全解决了这个问题。我们需要一些外部库来运行这个程序吗?正如我已经提到的:这需要
libresolv
,它最初来自BIND项目(但glibc有一个副本)。如何安装这个库?我们不能在没有任何外部库的情况下进行MX查询吗?它是一个“外部库”,与
libc
是一个“外部库”的意义相同:它是您程序的外部库,您可以根据需要对其进行静态链接,但您无需安装它:它将出现在每个系统上。@Ephiment:非常感谢您的程序。对于其他人,请查看下面的答案(我自己)以完成上述答案。如果您缺少
/usr/lib/libresolv.so
,您仍然应该使用
-Wl,-Bstatic-lresolv
,而不是直接指向
libresolv.a
。您不必指定库的路径。您可能看到的问题是,在
-lresolv
之后链接的库没有可用的静态版本。因此您可以这样做:
-Wl,-Bstatic-lresolv-Wl,-Bdynamic
,或者更简洁地说:
-static-lresolv-dynamic
main(){
char *mxs[10];
int a;
printf("%d\n",a=resolvmx("gmail.com",mxs,10));
printf("%s\n",mxs[a-1]);
}
gcc <pname.c> /usr/lib/libresolv.a   (instead of gcc pname.c -lresolv)