struct __res_state {
int retrans; /* retransmition time interval */
int retry; /* number of times to retransmit */
unsigned long options; /* option flags - see below. */
int nscount; /* number of name servers */
struct sockaddr_in
nsaddr_list[MAXNS]; /* address of name server */
unsigned short id; /* current message id */
/* 2 byte hole here. */
char *dnsrch[MAXDNSRCH+1]; /* components of domain to search */
char defdname[256]; /* default domain (deprecated) */
unsigned long pfcode; /* RES_PRF_ flags - see below. */
unsigned ndots:4; /* threshold for initial abs. query */
unsigned nsort:4; /* number of elements in sort_list[] */
unsigned ipv6_unavail:1; /* connecting to IPv6 server failed */
unsigned unused:23;
struct {
struct in_addr addr;
uint32_t mask;
} sort_list[MAXRESOLVSORT];
/* 4 byte hole here on 64-bit architectures. */
void * __glibc_unused_qhook;
void * __glibc_unused_rhook;
int res_h_errno; /* last one set for this context */
int _vcsock; /* PRIVATE: for res_send VC i/o */
unsigned int _flags; /* PRIVATE: see below */
/* 4 byte hole here on 64-bit architectures. */
union {
char pad[52]; /* On an i386 this means 512b total. */
struct {
uint16_t nscount;
uint16_t nsmap[MAXNS];
int nssocks[MAXNS];
uint16_t nscount6;
uint16_t nsinit;
struct sockaddr_in6 *nsaddrs[MAXNS];
#ifdef _LIBC
unsigned long long int __glibc_extension_index
__attribute__((packed));
#else
unsigned int __glibc_reserved[2];
#endif
} _ext;
} _u;
};
1. 问题背景一个无效的DNS地址,通过res_nsearch接口解析其IP地址。由于res_nsearch查询过程过慢,影响系统其他业务的使用。2. 解决思路由于res_nsearch接口是在glibc库中实现,阅读源码了解其实际工作原理,以解决查询过慢的问题。3. 重要数据结构贯穿于res_nxxx系列接口函数的重要数据结构如下:struct __res_state { int retrans; /* retransmition time interval */ int ret