📄 225.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="187.htm">上一层</a>][<a href="226.htm">下一篇</a>]
<hr><p align="left"><small>发信人: guru (好读书,不求甚解), 信区: UNP <br>
标 题: a demo MX query program <br>
发信站: UNIX编程 (2001年08月17日20:12:47 星期五), 站内信件 <br>
<br>
:作者 ejiang (enthusiast) <br>
:时间 06/02/01 07:40 AM <br>
:附加文件 124692-n1.c.txt <br>
<br>
/* this is a demo MX query program for LinuxForum.net's <br>
* reference only. Your bug fix and comments are welcome <br>
* at Edward.Jiang@oracle.com <br>
*/ <br>
<br>
#include <stdio.h> <br>
#include <stdlib.h> <br>
#include <sys/types.h> <br>
#include <sys/socket.h> <br>
#include <netinet/in.h> <br>
#include <arpa/nameser.h> <br>
#include <arpa/inet.h> <br>
#include <resolv.h> <br>
#include <netdb.h> <br>
#include <string.h> <br>
<br>
#define CLASS_INTERNET 1 <br>
#define TYPE_MX 15 <br>
#define PACKAGE_BUFF_SIZE 256 <br>
#define COMPRESSION_FLAG 0xC0 <br>
<br>
/* this routine copies a dns format RR to a string recursively <br>
* refer to RFC 1035 for details <br>
*/ <br>
int namecpy(unsigned char *start, unsigned char *name, unsigned char **buffer) <br>
{ <br>
unsigned char *p, *n, *p1; <br>
int len; <br>
<br>
n = name; <br>
p = *buffer; <br>
<br>
while ((*p) && (p-start<PACKAGE_BUFF_SIZE)) { <br>
if ((*p) == COMPRESSION_FLAG) { // recursively copy compressed name <br>
p1 = start+(*(++p)); <br>
n += namecpy(start, n, &p1); <br>
n++; <br>
n++; <br>
break; // well, if compressed data processed, there is no 0 at the end <br>
} <br>
else { <br>
len = *p; <br>
memcpy(n, ++p, len); <br>
n+=len; <br>
*(n++) = '.'; <br>
p+=len; <br>
} <br>
<br>
} <br>
++p; <br>
if (n>name) <br>
*(--n)='\0'; // if name found, delete last '.' <br>
*buffer = p; <br>
return n-name; <br>
} <br>
<br>
/* This routine calls resolv library to retrive a MX RR <br>
* Warning: because we use static buffer, so this routine is not thread-safe <br>
*/ <br>
unsigned char * get_mx_ip(char *domain) <br>
{ <br>
unsigned char buffer[PACKAGE_BUFF_SIZE], name[PACKAGE_BUFF_SIZE]; <br>
static unsigned char ip[PACKAGE_BUFF_SIZE]; <br>
unsigned char *p; <br>
unsigned int i; <br>
unsigned short t16, result, query; <br>
struct hostent *mxhosts; <br>
<br>
memset(buffer, 0, PACKAGE_BUFF_SIZE); <br>
<br>
if (!res_query(domain, <br>
CLASS_INTERNET, <br>
TYPE_MX, <br>
buffer, <br>
PACKAGE_BUFF_SIZE)) { <br>
return NULL; <br>
} <br>
else { <br>
p = buffer + 4; <br>
<br>
memcpy(&t16, p, 2); <br>
query = ntohs(t16); // got query record <br>
p += 2; <br>
memcpy(&t16, p, 2); <br>
result = ntohs(t16); // got result record <br>
p += 6; <br>
<br>
if (result>0) { <br>
*name = '\0'; <br>
while (p<buffer+PACKAGE_BUFF_SIZE && query>0) { // we need to ingore all quer <br>
y records <br>
namecpy(buffer, name, &p); <br>
p += 4; <br>
query--; <br>
} <br>
if (query>0) <br>
return NULL; // haven't reached result <br>
<br>
while (p<buffer+PACKAGE_BUFF_SIZE) { <br>
i = namecpy(buffer, name, &p); <br>
if (!strncasecmp(domain, name, i)) { <br>
i = htonl((TYPE_MX<<16)+CLASS_INTERNET); // check if current RR is IN/MX <br>
if (!memcmp(p, &i, 4)) { <br>
p += 12; // goto name <br>
*name = '\0'; // clean name string <br>
namecpy(buffer, name, &p); <br>
break; <br>
} <br>
} <br>
} <br>
if ((*name)!='\0') { <br>
/* FIX ME: mxhosts may contain more than one IP address <br>
but now we just use the first one */ <br>
mxhosts = gethostbyname(name); <br>
inet_ntop(AF_INET, mxhosts->h_addr, ip, PACKAGE_BUFF_SIZE); <br>
return ip; <br>
} <br>
} <br>
} <br>
return NULL; <br>
<br>
} <br>
<br>
/* main rountine */ <br>
int main(int argc, char *argv[]) <br>
{ <br>
{ <br>
int i; <br>
unsigned char *p; <br>
<br>
if (argc<2) { <br>
fprintf(stderr, "Usage: %s <domain name> ...\n", argv[0]); <br>
exit(-1); <br>
} <br>
else { <br>
for (i=1; i<argc; i++) { <br>
p = get_mx_ip(argv[i]); <br>
printf("Domain %s, ", argv[i]); <br>
if (p!=NULL) { <br>
printf("MX's IP Address: %s\n", p); <br>
} <br>
else { <br>
printf("Error\n"); <br>
} <br>
} <br>
} <br>
return 0; <br>
} <br>
<br>
<br>
<br>
-- <br>
I Have A Dream: <br>
I Believe I Can Fly. <br>
路一步步走,目标一个个实现; <br>
既然已经选择,就要义无返顾; <br>
※ 修改:·guru 於 08月17日20:17:27 修改本文·[FROM: 202.114.36.176] <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.36.176] <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="187.htm">上一层</a>][<a href="226.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -