⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 225.htm

📁 unix高级编程原吗
💻 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 + -