📄 147.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 + -