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

📄 147.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>123</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="135.htm">上一层</a>][<a href="148.htm">下一篇</a>]
<hr><p align="left"><small>发信人: creek (town), 信区: linux <br>

标  题: linux链路层编程 <br>

发信站: 饮水思源站 (Thu Oct  7 19:22:23 1999) , 站内信件 <br>

  <br>

    tcpdump是linux下常用的捕获链路层数据的工具, <br>

我把它改成最简版,才140行,在REDHAT6下可以直接编译, <br>

捕获所有的链路层数据。 <br>

    当然要首先安装libpcap函数库罗。 <br>

  <br>

  <br>

#include <sys/types.h> <br>

#include <sys/time.h> <br>

#include <netinet/in.h> <br>

#include <pcap/pcap.h> <br>

#include <signal.h> <br>

#include <stdio.h> <br>

#ifdef __STDC__ <br>

#include <stdlib.h> <br>

#endif <br>

#include <unistd.h> <br>

#include <string.h> <br>

  <br>

int snaplen =200 ; <br>



  <br>

struct printer { <br>

 pcap_handler f; <br>

 int type; <br>

}; <br>

  <br>

void ether_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p) <br>

{ <br>

        int i; <br>

        int caplen = h->caplen; <br>

        int length = h->len; <br>

        printf("\nGet packet:\n"); <br>

  <br>

        default_print(p, length); <br>

 } <br>

  <br>

static struct printer printers[] = { <br>

 { ether_if_print, DLT_EN10MB }, <br>

// { sl_if_print,  DLT_SLIP }, <br>

// { ppp_if_print,  DLT_PPP }, <br>

// { fddi_if_print, DLT_FDDI }, <br>

// { null_if_print, DLT_NULL }, <br>



 { NULL,   0 }, <br>

}; <br>

  <br>

static pcap_handler lookup_printer(int type) <br>

{ <br>

 struct printer *p; <br>

  <br>

 for (p = printers; p->f; ++p) <br>

  if (type == p->type) <br>

   return p->f; <br>

 error("unknown data link type 0x%x", type); <br>

  <br>

} <br>

  <br>

static pcap_t *pd; <br>

  <br>

int main(int argc, char **argv) <br>

{ <br>

 int cnt; <br>

 u_long localnet, netmask; <br>

 char *cp, *infile, *cmdbuf="", *device; <br>

 pcap_handler printer; <br>



 struct bpf_program fcode; <br>

 u_char *pcap_userdata; <br>

 char errbuf[PCAP_ERRBUF_SIZE]; <br>

  <br>

 cnt = -1; <br>

 device = NULL; <br>

  <br>

 if (device == NULL) { <br>

         device = pcap_lookupdev(errbuf); <br>

  if (device == NULL) <br>

   error(errbuf); <br>

 } <br>

  pd = pcap_open_live(device, snaplen, 0, 500, errbuf); <br>

        if (pd == NULL) <br>

        error(errbuf); <br>

  <br>

  if (pcap_lookupnet(device, &localnet, &netmask, errbuf) < 0) <br>

  error(errbuf); <br>

  <br>

  setuid(getuid()); <br>

  <br>

 if (pcap_compile(pd, &fcode, cmdbuf, 0, netmask) < 0) <br>



     error(pcap_geterr(pd)); <br>

  <br>

 if (pcap_setfilter(pd, &fcode) < 0) <br>

     error(pcap_geterr(pd)); <br>

 printer = lookup_printer(pcap_datalink(pd)); <br>

  pcap_userdata = 0; <br>

  <br>

 if (pcap_loop(pd, cnt, printer, pcap_userdata) < 0) { <br>

  (void)fprintf(stderr, "%s: pcap_loop: %s\n", <br>

      "wrong", pcap_geterr(pd)); <br>

  exit(1); <br>

 } <br>

  <br>

 pcap_close(pd); <br>

 exit(0); <br>

} <br>

  <br>

/* Like default_print() but data need not be aligned */ <br>

void <br>

default_print_unaligned(register const u_char *cp, register int length) <br>

{ <br>

 register u_int i, s; <br>



 register int nshorts; <br>

  <br>

 nshorts = (u_int) length / sizeof(u_short); <br>

 i = 0; <br>

 while (--nshorts >= 0) { <br>

  if ((i++ % 8) == 0) <br>

   (void)printf("\n\t\t\t"); <br>

  s = *cp++; <br>

  (void)printf(" %02x%02x", s, *cp++); <br>

 } <br>

 if (length & 1) { <br>

  if ((i % 8) == 0) <br>

   (void)printf("\n\t\t\t"); <br>

  (void)printf(" %02x", *cp); <br>

 } <br>

} <br>

  <br>

void <br>

default_print(register const u_char *bp, register int length) <br>

{ <br>

 register const u_short *sp; <br>

 register u_int i; <br>



 register int nshorts; <br>

  <br>

 if ((int)bp & 1) { <br>

  default_print_unaligned(bp, length); <br>

  return; <br>

 } <br>

 sp = (u_short *)bp; <br>

 nshorts = (u_int) length / sizeof(u_short); <br>

 i = 0; <br>

 while (--nshorts >= 0) { <br>

  if ((i++ % 8) == 0) <br>

   (void)printf("\n\t\t\t"); <br>

  (void)printf(" %04x", ntohs(*sp++)); <br>

 } <br>

 if (length & 1) { <br>

  if ((i % 8) == 0) <br>

   (void)printf("\n\t\t\t"); <br>

  (void)printf(" %02x", *(u_char *)sp); <br>

 } <br>

} <br>

  <br>

  <br>



  <br>

  <br>

-- <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="135.htm">上一层</a>][<a href="148.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 + -