韩剧1988免费观看全集_久久影视三级福利片_亚洲视频在线观看免费_在线观看欧美日韩_国产亚洲激情在线_亚洲精品美女久久久_欧美国产日韩一区二区在线观看_91在线观看免费高清完整版在线观看_日韩av免费看_国产又爽又黄的激情精品视频_琪琪亚洲精品午夜在线_欧美性猛xxx_不卡毛片在线看_国产亚洲日本欧美韩国_91国内在线视频_精品国产福利视频

當(dāng)前位置:蘿卜系統(tǒng) > 網(wǎng)絡(luò)技術(shù)教程 > 詳細(xì)頁(yè)面

網(wǎng)絡(luò)協(xié)議區(qū)分軟件的編寫(xiě)

網(wǎng)絡(luò)協(xié)議區(qū)分軟件的編寫(xiě)

更新時(shí)間:2019-03-21 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

網(wǎng)絡(luò)技術(shù)是從1990年代中期發(fā)展起來(lái)的新技術(shù),它把互聯(lián)網(wǎng)上分散的資源融為有機(jī)整體,實(shí)現(xiàn)資源的全面共享和有機(jī)協(xié)作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計(jì)算機(jī)、存儲(chǔ)資源、數(shù)據(jù)資源、信息資源、知識(shí)資源、專家資源、大型數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)、傳感器等。 當(dāng)前的互聯(lián)網(wǎng)只限于信息共享,網(wǎng)絡(luò)則被認(rèn)為是互聯(lián)網(wǎng)發(fā)展的第三階段。

前一陣子要寫(xiě)一個(gè)簡(jiǎn)單的arp協(xié)議的分析程序,在翻閱了一些資料以后,決定使用libpcap庫(kù)來(lái)實(shí)現(xiàn),但是后來(lái)涉及到寫(xiě)鏈路層數(shù)據(jù)的緣故(另外一個(gè)程序,這個(gè)程序就是發(fā)送一個(gè)假冒的arp request,在本文沒(méi)有實(shí)現(xiàn),今后有空再整理吧),所以放棄了libpcap。由于本人使用的是solaris環(huán)境,所以無(wú)法使用bpf,但是sun公司仍然為開(kāi)發(fā)者提供了一個(gè)與設(shè)備底層無(wú)關(guān)的接口DLPI,DLPI的全稱是Data Link Provider Interface,通過(guò)DLPI開(kāi)發(fā)者可以訪問(wèn)數(shù)據(jù)鏈路層的數(shù)據(jù)包,在早期的sunos系統(tǒng)中基本上采用的是NIT設(shè)備,但是現(xiàn)在solaris系統(tǒng)都使用了DLPI.關(guān)于DLPI的具體介紹大家可以訪問(wèn)網(wǎng)站www.opengroup.org/pubs/catalog/c811.htm,我這里就不多說(shuō)了。
在搜索了許多資料之后發(fā)現(xiàn)目前關(guān)于DLPI的編程資料不多,沒(méi)有具體的過(guò)程,后來(lái)翻閱了Neal Nuckolls寫(xiě)的一篇文章How to Use the STREAMS Data Link Provider Interface (DLPI),根據(jù)例子做了修改(主要是提供了協(xié)議分析的部分),現(xiàn)在把編寫(xiě)一個(gè)DLPI過(guò)程共享一下,希望能對(duì)大家有所幫助。建議大家可以先看看Neal Nuckolls的文章,其中有部分涉及到流編程的,可以參考http://docs.sun.com/app/docs/doc/816-4855的streams programming guide(不過(guò)這不是必須的)。
使用DLPI來(lái)訪問(wèn)數(shù)據(jù)鏈路層有幾個(gè)步驟:
1、打開(kāi)網(wǎng)絡(luò)設(shè)備
2、將一個(gè)流 attach到一個(gè)特定的設(shè)備上,這里就是我們剛才打開(kāi)的設(shè)備
3、將設(shè)備設(shè)置為混雜模式(可選)
4、把數(shù)據(jù)鏈路層sap綁定到流
5、調(diào)用ioctl,設(shè)置raw模式
6、配置其他模塊(可選)
7、刷新緩存
8、接收數(shù)據(jù)進(jìn)入分析階段
第一步,我們首先打開(kāi)一個(gè)網(wǎng)絡(luò)設(shè)備,在本例中我們打開(kāi)的是/dev/bge設(shè)備,這是本機(jī)的網(wǎng)絡(luò)接口,注意不是/dev/bge0,通過(guò)open調(diào)用打開(kāi),并且返回一個(gè)描述符
fd=open(device, 2)
第二步,attach一個(gè)流到設(shè)備上,這是通過(guò)發(fā)送DL_ATTACH_REQ原語(yǔ)來(lái)完成的
dlattachreq(fd, ppa)
int fd;
u_long ppa;
{
dl_attach_req_t attach_req;
struct strbuf ctl;
int flags;

attach_req.dl_primitive = DL_ATTACH_REQ;
attach_req.dl_ppa = ppa;

ctl.maxlen = 0;
ctl.len = sizeof (attach_req);
ctl.buf = (char *) &attach_req;

flags = 0;

if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
syserr("dlattachreq:  putmsg");
}
dl_attach_req_t是一個(gè)定義在dlpi.h中的結(jié)構(gòu)體,我們通過(guò)填寫(xiě)結(jié)構(gòu)體來(lái)發(fā)布原語(yǔ),putmsg將消息發(fā)送到一個(gè)流,以上這個(gè)函數(shù)是DLPI中發(fā)布原語(yǔ)的主要格式
發(fā)布了DL_ATTACH_REQ原語(yǔ)之后,還要確認(rèn)是否成功,
dlokack(fd, bufp)
int fd;
char *bufp;
{
union DL_primitives *dlp;
struct strbuf ctl;
int flags;

ctl.maxlen = MAXDLBUF;
ctl.len = 0;
ctl.buf = bufp;

strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlokack");

dlp = (union DL_primitives *) ctl.buf;

expecting(DL_OK_ACK, dlp);

if (ctl.len < sizeof (dl_ok_ack_t))
err("dlokack:  response ctl.len too short:  %d", ctl.len);

if (flags != RS_HIPRI)
err("dlokack:  DL_OK_ACK was not M_PCPROTO");

if (ctl.len < sizeof (dl_ok_ack_t))
err("dlokack:  short response ctl.len:  %d", ctl.len);
}
第三步,將設(shè)備設(shè)置為混雜模式下工作(可選)
dlpromisconreq(fd, DL_PROMISC_PHYS);
這一個(gè)步驟也是通過(guò)發(fā)布DLPI原語(yǔ)來(lái)實(shí)現(xiàn)的,具體代碼后面給出
第四步,綁定流
dlbindreq(fd, sap, 0, DL_CLDLS, 0, 0);
dlbindack(fd, buf);
第五步,設(shè)置raw模式
strioctl(fd, DLIOCRAW, -1, 0, NULL)
第六步,配置其他模塊(在詳細(xì)代碼中給出)
第七步,刷新數(shù)據(jù),這是通過(guò)ioctl調(diào)用實(shí)現(xiàn)的
ioctl(fd, I_FLUSH, FLUSHR)
第八步,這是我們最關(guān)心的步驟,實(shí)際上,前面的這些步驟我們都可以忽略,大致明白有這么個(gè)過(guò)程就可以了,到時(shí)候?qū)懘a的時(shí)候照搬這個(gè)框架就可以。使用DLPI編程并不難,關(guān)鍵在于大家要了解它的框架,沒(méi)必要非得自己去寫(xiě)一個(gè)框架來(lái),本文就是利用了Michael R. Widner的代碼,今后如果要增加功能只需要往這個(gè)框架里填就可以了。
協(xié)議分析的過(guò)程是在函數(shù)filter完成的,函數(shù)申明如下
void filter(register char *cp,register u_int  pktlen);
該函數(shù)接收兩個(gè)參數(shù),cp是直接從設(shè)備緩存里拷貝過(guò)來(lái)的待分析數(shù)據(jù),是鏈路層的封裝數(shù)據(jù),pktlen是數(shù)據(jù)的長(zhǎng)度。在本文中由于操作環(huán)境是以太網(wǎng),因此接收的數(shù)據(jù)鏈路層數(shù)據(jù)是以太網(wǎng)封裝格式,如不清楚以太網(wǎng)封裝的可以參考《TCP/IP詳解 卷一:協(xié)議》,以太網(wǎng)封裝三種標(biāo)準(zhǔn)的協(xié)議類型:IP協(xié)議、ARP協(xié)議和RARP協(xié)議。14字節(jié)的以太網(wǎng)首部包括了6字節(jié)的目的地址,6字節(jié)的源地址和2字節(jié)的類型字段,IP的類型值為0x0800,ARP的類型值為0x0806,RARP的類型值為0x8035。通過(guò)檢查類型字段來(lái)區(qū)別接收到的數(shù)據(jù)是屬于哪一種協(xié)議,函數(shù)實(shí)現(xiàn)代碼如下
void filter(cp, pktlen)
register char *cp;
register u_int pktlen;
{
register struct ip     *ip;
register struct tcphdr *tcph;
register struct ether_header *eth;
char *head=cp;
static long line_count=0;//計(jì)數(shù)器,用來(lái)記錄接收的數(shù)據(jù)次數(shù)

u_short EtherType=ntohs(((struct ether_header *)cp)->ether_type);
  //如果EtherType小于0x600說(shuō)明這是一個(gè)符合802.3標(biāo)準(zhǔn)的數(shù)據(jù)格式,應(yīng)當(dāng)對(duì)數(shù)據(jù)作出調(diào)整
  if(EtherType < 0x600) {
    EtherType = *(u_short *)(cp + SZETH + 6);
    cp+=8; pktlen-=8;
  }
  eth=(struct ether_header*)cp;
  fprintf(LOG,"%-5d",++line_count);
  if(EtherType == ETHERTYPE_IP) //檢查協(xié)議類型是否IP協(xié)議
  {
  ip=(struct ip *)(cp+SZETH);//調(diào)整指針的位置,SZETH是以太網(wǎng)首部長(zhǎng)度
  Mac_info(e->ether_shost);//Mac_info函數(shù)打印出物理地址
  fprintf(LOG,"(");
  Ip_info(&ip->ip_src);//Ip_info函數(shù)打印出IP地址
  fprintf(LOG,")");
  fprintf(LOG,"--->");
  Mac_info(e->ether_dhost);
  fprintf(LOG,"(");
  Ip_info(&ip->ip_dst);
  fprintf(LOG,")");
  fprintf(LOG,"\n");
  }
  else if(EtherType == ARP_PROTO)//如果協(xié)議類型是ARP
  {
     cp+=SZETH;
     struct ether_arp *arp=(struct ether_arp *)cp;
     switch(ntohs(arp->ea_hdr.ar_op))//檢查arp的操作
     {
       case ARPOP_REQUEST:   //如果是arp請(qǐng)求
           fprintf(LOG,"arp request:who has ");
           arp_ip_info(arp->arp_tpa);  //打印arp報(bào)文信息中的地址
           fprintf(LOG," tells ");
           arp_ip_info(arp->arp_spa);
           fprintf(LOG,"\n");
           break;
       case ARPOP_REPLY:     //arp應(yīng)答
           fprintf(LOG,"arp reply: ");
           arp_ip_info(arp->arp_spa);
           fprintf(LOG," is at  ");
           Mac_info((struct ether_addr*)&arp->arp_sha);
           fprintf(LOG,"\n");
           break;
      }        
      //可以在這里添加代碼打印出arp數(shù)據(jù)報(bào)的具體內(nèi)容
   }
}
程序的具體實(shí)現(xiàn)代碼如下:
/*  程序sniffer.c的代碼清單 */
#include <sys/stream.h>
#include <sys/dlpi.h>
#include <sys/bufmod.h>

#include <stdio.h>
#include <ctype.h>
#include <string.h>

#include <sys/time.h>
#include <sys/file.h>
#include <sys/stropts.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>

#include <net/if.h>
#include <net/if_arp.h>

#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include <netinet/ip_var.h>
#include <netinet/udp_var.h>
#include <netinet/in_systm.h>
#include <netinet/tcp.h>
#include <netinet/ip_icmp.h>

#include <netdb.h>
#include <arpa/inet.h>


#define MAXDLBUF 32768
#define MAXWAIT 15
#define MAXDLADDR 1024
#define         BITSPERBYTE        8

#define bcopy(s1, s2, len) memcpy(s2, s1, len)
#define index(s, c) strchr(s, c)
#define rindex(s, c) strrchr(s, c)

#define bcmp(s1, s2, len) (memcmp(s1, s2, len)!=0)

#define ERR stderr

char    *device,
       *ProgName,
       *LogName;
FILE    *LOG;
int     debug=0;
long databuf[MAXDLBUF];
int sap=0;
#define NIT_DEV     "/dev/bge"
#define CHUNKSIZE   4096      
int     if_fd = -1;
int     Packet[CHUNKSIZE+32];


int promisc = 1;
int bufmod = 0;
int filter_flags=0;

int maxbuflen=128;

void Pexit(err,msg)
int err; char *msg;
{ perror(msg);
 exit(err); }

void Zexit(err,msg)
int err; char *msg;
{ fprintf(ERR,msg);
 exit(err); }
#define ARP_PROTO   (0x0806)
#define IP          ((struct ip *)Packet)
#define IP_OFFSET   (0x1FFF)
#define SZETH       (sizeof(struct ether_header))
#define ARPLEN      (sizeof(struct ether_arp))
#define MACLEN      (6)
#define IPALEN      (4)
#define IPLEN       (ntohs(ip->ip_len))
#define IPHLEN      (ip->ip_hl)
#define INET_ADDRSTRLEN 16

 

#define MAXBUFLEN  (8192)
time_t  LastTIME = 0;

 

char *Ptm(t)
register time_t *t;
{ register char *p = ctime(t);
 p[strlen(p)-6]=0;
 return(p);
}

char *NOWtm()
{ time_t tm;
 time(&tm);
 return( Ptm(&tm) );
}


void print_data(uchar_t *buf,int size)
{
int i=0;
char *p=buf;
for(;i<size;i++){
if(i%16 == 0) fprintf(LOG,"\n");
if(i%2 == 0) fprintf(LOG," ");
fprintf(LOG,"%02x",*p++&0x00ff);
}
fprintf(LOG,"\n");
}
//打印物理地址
void Mac_info(struct ether_addr*mac)
{
  fprintf(LOG,"%02x:%02x:%02x:%02x:%02x:%02x",
          mac->ether_addr_octet[0],
          mac->ether_addr_octet[1],
          mac->ether_addr_octet[2],  
          mac->ether_addr_octet[3],  
          mac->ether_addr_octet[4],
          mac->ether_addr_octet[5]);
}
//打印ip地址char buf[MAXDLBUF];
 
void Ip_info(struct in_addr *ip)
{
  char str[INET_ADDRSTRLEN];
  inet_ntop(AF_INET,ip,str,sizeof(str));
  if(*str)
  fprintf(LOG,"%s",str);
 
}
//打印ip地址的另外一個(gè)版本
void arp_ip_info(uchar_t pa[])
{
   fprintf(LOG,"%d.%d.%d.%d",pa[0],pa[1],pa[2],pa[3]);
}

void death()
{ register struct CREC *CLe;

   
   fprintf(LOG,"\nLog ended at => %s\n",NOWtm());
   fflush(LOG);
   if(LOG != stdout)
       fclose(LOG);
   exit(1);
}

 

err(fmt, a1, a2, a3, a4)
char *fmt;
char *a1, *a2, *a3, *a4;
{
(void) fprintf(stderr, fmt, a1, a2, a3, a4);
(void) fprintf(stderr, "\n");
(void) exit(1);
}

void
sigalrm()
{
(void) err("sigalrm:  TIMEOUT");
}

strgetmsg(fd, ctlp, datap, flagsp, caller)
int fd;
struct strbuf *ctlp, *datap;
int *flagsp;
char *caller;
{
int rc;
static char errmsg[80];


(void) signal(SIGALRM, sigalrm);
if (alarm(MAXWAIT) < 0) {
(void) sprintf(errmsg, "%s:  alarm", caller);
syserr(errmsg);
}


*flagsp = 0;
if ((rc = getmsg(fd, ctlp, datap, flagsp)) < 0) {
(void) sprintf(errmsg, "%s:  getmsg", caller);
syserr(errmsg);
}


if (alarm(0) < 0) {
(void) sprintf(errmsg, "%s:  alarm", caller);
syserr(errmsg);
}


if ((rc & (MORECTL | MOREDATA)) == (MORECTL | MOREDATA))
err("%s:  MORECTL|MOREDATA", caller);
if (rc & MORECTL)
err("%s:  MORECTL", caller);
if (rc & MOREDATA)
err("%s:  MOREDATA", caller);


[page_break]

if (ctlp->len < sizeof (long))
err("getmsg:  control portion length < sizeof (long):  %d", ctlp->len);
}

expecting(prim, dlp)
int prim;
union DL_primitives *dlp;
{
if (dlp->dl_primitive != (u_long)prim) {
err("unexpected dlprim error\n");
exit(1);
}
}
strioctl(fd, cmd, timout, len, dp)
int fd;
int cmd;
int timout;
int len;
char *dp;
{
struct strioctl sioc;
int rc;

sioc.ic_cmd = cmd;
sioc.ic_timout = timout;
sioc.ic_len = len;
sioc.ic_dp = dp;
rc = ioctl(fd, I_STR, &sioc);

if (rc < 0)
return (rc);
else
return (sioc.ic_len);
}
dlattachreq(fd, ppa)
int fd;
u_long ppa;
{
dl_attach_req_t attach_req;
struct strbuf ctl;
int flags;

attach_req.dl_primitive = DL_ATTACH_REQ;
attach_req.dl_ppa = ppa;

ctl.maxlen = 0;
ctl.len = sizeof (attach_req);
ctl.buf = (char *) &attach_req;

flags = 0;

if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
syserr("dlattachreq:  putmsg");
}

dlokack(fd, bufp)
int fd;
char *bufp;
{
union DL_primitives *dlp;
struct strbuf ctl;
int flags;

ctl.maxlen = MAXDLBUF;
ctl.len = 0;
ctl.buf = bufp;

strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlokack");

dlp = (union DL_primitives *) ctl.buf;

expecting(DL_OK_ACK, dlp);

if (ctl.len < sizeof (dl_ok_ack_t))
err("dlokack:  response ctl.len too short:  %d", ctl.len);

if (flags != RS_HIPRI)
err("dlokack:  DL_OK_ACK was not M_PCPROTO");

if (ctl.len < sizeof (dl_ok_ack_t))
err("dlokack:  short response ctl.len:  %d", ctl.len);
}


dlbindreq(fd, sap, max_conind, service_mode, conn_mgmt, xidtest)
int fd;
u_long sap;
u_long max_conind;
u_long service_mode;
u_long conn_mgmt;
u_long xidtest;
{
dl_bind_req_t bind_req;
struct strbuf ctl;
int flags;

bind_req.dl_primitive = DL_BIND_REQ;
bind_req.dl_sap = sap;
bind_req.dl_max_conind = max_conind;
bind_req.dl_service_mode = service_mode;
bind_req.dl_conn_mgmt = conn_mgmt;
bind_req.dl_xidtest_flg = xidtest;

ctl.maxlen = 0;
ctl.len = sizeof (bind_req);
ctl.buf = (char *) &bind_req;

flags = 0;

if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
syserr("dlbindreq:  putmsg");
}

dlbindack(fd, bufp)
int fd;
char *bufp;
{
union DL_primitives *dlp;
struct strbuf ctl;
int flags;

ctl.maxlen = MAXDLBUF;
ctl.len = 0;
ctl.buf = bufp;

strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlbindack");

dlp = (union DL_primitives *) ctl.buf;

expecting(DL_BIND_ACK, dlp);

if (flags != RS_HIPRI)
err("dlbindack:  DL_OK_ACK was not M_PCPROTO");

if (ctl.len < sizeof (dl_bind_ack_t))
err("dlbindack:  short response ctl.len:  %d", ctl.len);
}

dlpromisconreq(fd, level)
int fd;
u_long level;
{
dl_promiscon_req_t promiscon_req;
struct strbuf ctl;
int flags;

promiscon_req.dl_primitive = DL_PROMISCON_REQ;
promiscon_req.dl_level = level;

ctl.maxlen = 0;
ctl.len = sizeof (promiscon_req);
ctl.buf = (char *) &promiscon_req;

flags = 0;

if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
syserr("dlpromiscon:  putmsg");

}

syserr(s)
char *s;
{
(void) perror(s);
exit(1);
}

 


void filter(cp, pktlen)
register char *cp;
register u_int pktlen;
{
register struct ip     *ip;
register struct tcphdr *tcph;
register struct ether_header *eth;
char *head=cp;
static long line_count=0;

u_short EtherType=ntohs(((struct ether_header *)cp)->ether_type);
 
  if(EtherType < 0x600) {
    EtherType = *(u_short *)(cp + SZETH + 6);
    cp+=8; pktlen-=8;
  }
  eth=(struct ether_header*)cp;
  fprintf(LOG,"%-5d",++line_count);
  if(EtherType == ETHERTYPE_IP)
  {
  ip=(struct ip *)(cp+SZETH);
 

  Mac_info(e->ether_shost);
  fprintf(LOG,"(");
  Ip_info(&ip->ip_src);
 
  fprintf(LOG,")");
  fprintf(LOG,"--->");
  Mac_info(e->ether_dhost);
  fprintf(LOG,"(");
  Ip_info(&ip->ip_dst);
 
  fprintf(LOG,")");
  fprintf(LOG,"\n");
 
 
 
  }
  else if(EtherType == ARP_PROTO)
  {
     cp+=SZETH;
     struct ether_arp *arp=(struct ether_arp *)cp;
     switch(ntohs(arp->ea_hdr.ar_op))
     {
       case ARPOP_REQUEST:
           fprintf(LOG,"arp request:who has ");
           arp_ip_info(arp->arp_tpa);
           fprintf(LOG," tells ");
           arp_ip_info(arp->arp_spa);
           fprintf(LOG,"\n");
           break;
       case ARPOP_REPLY:
           fprintf(LOG,"arp reply: ");
           arp_ip_info(arp->arp_spa);
           fprintf(LOG," is at  ");
           Mac_info((struct ether_addr*)&arp->arp_sha);
           fprintf(LOG,"\n");
           break;
       
      }        
      //打印出arp數(shù)據(jù)報(bào)的內(nèi)容
     
   }

 

}

do_it()
{
long buf[MAXDLBUF];
char *device;
int ppa;
int fd;

struct strbuf data;
int flags;
int i;
int c;
int offset;
int len;
struct timeval t;
u_int chunksize = 16 * 1024;
struct sb_hdr *bp;
char *p, *limp;

int mrwtmp;

device = "/dev/bge";
ppa = 0;
sap= 0x0806;


if ((fd = open(device, 2)) < 0)
syserr(device);

dlattachreq(fd, ppa);
dlokack(fd, buf);


if (promisc) {
dlpromisconreq(fd, DL_PROMISC_PHYS);          
dlokack(fd, buf);
}


dlbindreq(fd, sap, 0, DL_CLDLS, 0, 0);
dlbindack(fd, buf);
     

if (strioctl(fd, DLIOCRAW, -1, 0, NULL) < 0)
syserr("DLIOCRAW");

if (bufmod) {
if (ioctl(fd, I_PUSH, "bufmod") < 0)
syserr("push bufmod");

t.tv_sec = 0;
t.tv_usec = 500000;
if (strioctl(fd, SBIOCSTIME, -1, sizeof (struct timeval),
&t) < 0)
syserr("SBIOCSTIME");
if (strioctl(fd, SBIOCSCHUNK, -1, sizeof (u_int),
&chunksize) < 0)
syserr("SBIOCSCHUNK");
}


if (ioctl(fd, I_FLUSH, FLUSHR) < 0)
syserr("I_FLUSH");

       if(1){
data.buf = (char *) databuf;
data.maxlen = MAXDLBUF;
data.len = 0;

     
while (((mrwtmp=getmsg(fd, NULL, &data, &flags))==0) ||
(mrwtmp==MOREDATA) || (mrwtmp=MORECTL)) {
p = data.buf;
limp = p + data.len;
filter(data.buf, data.len);
data.len = 0;
}
printf("finished getmsg() = %i\n",mrwtmp);
            }
       
}


int main(argc, argv)
int argc;
char **argv;
{
   char   cbuf[BUFSIZ];
   struct ifconf ifc;
   int    s,
          ac=1,
          backg=0;

   ProgName=argv[0];


   device=NIT_DEV;
   while((ac<argc) && (argv[ac][0] == '-')) {
      register char ch = argv[ac++][1];
      switch(toupper(ch)) {
           case 'I': device=argv[ac++];
                     break;
           case 'O': if(!(LOG=fopen((LogName=argv[ac++]),"a")))
                        Zexit(1,"Output file cant be opened\n");
                     break;
           case 's':
                     sap=atoi(argv[ac++]);
                     break;
           default : fprintf(ERR,
                       "Usage: %s  [-s]  [-i interface] [-o file]\n",
                           ProgName);
fprintf(ERR," -d int    set new data limit (128 default)\n");
fprintf(ERR," -o <file> output to <file>\n");
                     exit(1);
      }
   }

   fprintf(ERR,"Using logical device %s [%s]\n",device,NIT_DEV);
   fprintf(ERR,"Output to %s.%s%s",(LOG)?LogName:"stdout",
           (debug)?" (debug)":"",(backg)?" Backgrounding ":"\n");

   if(!LOG)
       LOG=stdout;

   signal(SIGINT, death);
   signal(SIGTERM,death);
   signal(SIGKILL,death);
   signal(SIGQUIT,death);

   if(backg && debug) {
        fprintf(ERR,"[Cannot bg with debug on]\n");
        backg=0;
   }

   fprintf(LOG,"\nLog started at => %s [pid %d]\n",NOWtm(),getpid());
   fflush(LOG);

   do_it();
}

 

編譯運(yùn)行:
#gcc -lsocket -lsnl -o sniffer sniffer.c
#./sniffer
同時(shí)在另一個(gè)終端上運(yùn)行ping 192.168.1.10

Using logical device /dev/bge [/dev/bge]
Output to stdout.

Log started at => Tue Jul 12 18:13:44 [pid 948]
1    arp request:who has 192.168.1.22 tells 192.168.1.10
2    arp request:who has 192.168.1.22 tells 192.168.1.10
3    arp request:who has 192.168.1.22 tells 192.168.1.10
4    arp request:who has 192.168.1.22 tells 192.168.1.10
5    arp request:who has 192.168.1.22 tells 192.168.1.10



網(wǎng)絡(luò)的神奇作用吸引著越來(lái)越多的用戶加入其中,正因如此,網(wǎng)絡(luò)的承受能力也面臨著越來(lái)越嚴(yán)峻的考驗(yàn)―從硬件上、軟件上、所用標(biāo)準(zhǔn)上......,各項(xiàng)技術(shù)都需要適時(shí)應(yīng)勢(shì),對(duì)應(yīng)發(fā)展,這正是網(wǎng)絡(luò)迅速走向進(jìn)步的催化劑。

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

網(wǎng)站地圖xml | 網(wǎng)站地圖html
日韩欧美美女一区二区三区| 欧美freesex| 这里都是精品| 欧美激情在线免费观看| 国外男同性恋在线看| 亚洲精品一级二级| 日本欧美在线视频免费观看| 国产精品成人一区| 国产午夜精品一区理论片飘花| 国产在线黄色片| 一本久道久久综合中文字幕| 在线观看免费高清视频97| 亚洲天堂网中文字| 国产欧美综合精品一区二区| 亚洲一二三专区| 欧美日韩一区二区三区视频播放| 五月婷婷六月丁香综合| 欧美视频网站| 欧美福利在线播放网址导航| 九一国产精品| 日韩激情免费| 99久久免费精品| www.我爱av| 农村少妇久久久久久久| 欧美xxxx做受欧美88bbw| www.爱久久| 亚洲欧美久久久久一区二区三区| 国产成人综合网站| 疯狂撞击丝袜人妻| 国产激情自拍视频| 国内精品视频在线观看| 国产视频每日更新| 国产女人伦码一区二区三区不卡| 国产三级欧美三级日产三级99| 精品日韩一区二区三区| 国产麻豆视频精品| 亚洲一区二区成人| 欧美日韩综合在线免费观看| 国产三级免费观看| 一级毛片视频在线观看| 日本黄色片在线播放| 久久一区二区三区欧美亚洲| 老子影院午夜伦不卡大全| 欧美hdxxxx| 九九热hot精品视频在线播放| 古装做爰无遮挡三级聊斋艳谭| 婷婷中文字幕在线观看| 中文有码在线观看| 中国av一区二区三区| 国产免费播放一区二区| 国产天堂资源| 性欧美videos另类喷潮| 日本免费久久高清视频| 成人午夜影院在线观看| 日本黄色免费网站| 国产精品二三区| 91一区二区三区| 2017亚洲男人天堂| 亚洲一区二区三区网站| 亚洲国产小视频在线观看| 日韩免费视频一区二区视频在线观看| 欧美孕妇性xxxⅹ精品hd| 这里只有精品在线| 99pao成人国产永久免费视频| 97超碰国产一区二区三区| 最近2018年在线中文字幕高清| 日韩黄色三级在线观看| 亚洲偷熟乱区亚洲香蕉av| 中文字幕jux大岛优香| 亚洲综合一区二区不卡| 羞羞网站在线| 偷拍欧美精品| 久久综合丝袜日本网| 亚洲第一欧美| 国产精品爱久久久久久久小说| 手机av在线免费观看| 女同激情久久av久久| 成人国产精品色哟哟| 国产精品视频第一区| 好吊视频在线观看| 蜜臀av午夜精品久久| 日韩三级av在线| 欧美日韩第二页| 天天操天天操天天操天天| 九九九热精品免费视频观看网站| 国产麻豆视频免费观看| 最近中文视频在线| 亚洲国产精品18久久久久久| 国产一区二区三区四区尤物| 亚洲精品乱码久久久久久久久久久久| 亚洲精品国产拍免费91在线| 久久er视频| 成人欧美一区二区三区视频xxx| 欧洲一区二区日韩在线视频观看免费| 9久久9毛片又大又硬又粗| 免费国产h视频在线观看86| 日本精品视频网站| 人妻内射一区二区在线视频| 国产一区 二区 三区一级| 免费黄色福利视频| 高清不卡日本v二区在线| 色婷婷亚洲十月十月色天| 久久婷婷五月综合色国产香蕉| 国产福利第一视频| 国产福利精品一区二区三区| 五月天久久777| 亚洲黑丝一区二区| 国产综合一区二区| 精品欧美一区二区久久久| 欧美亚洲一区| 欧美福利精品| 99在线视频免费观看| 九一国产精品视频| 亚洲欧美区自拍先锋| 一区二区三区精| 国产又黄又粗又猛又爽的视频| 精品国产精品| 可以免费观看av的网站| 欧美日韩电影一区二区三区| 涩涩视频网站| 欧美激情一二三区| 337p粉嫩大胆噜噜噜鲁| 黄色片免费观看视频| 欧美精品一区二区性色a+v| 成人在线精品| 九九热视频免费在线观看| 粉嫩小泬无遮挡久久久久久| 佐佐木明希av| 一区二区三区黄色片| 久久久久.com| 亚洲激情视频在线播放| 在线视频国内自拍亚洲视频| 黄页网站免费观看| 国产女人水真多18毛片18精品视频| 国产精品88a∨| 热re99久久精品国产66热| 久热视线观看免费视频| 人人妻人人添人人爽欧美一区| 瑟瑟视频在线| 天堂成人娱乐在线视频免费播放网站| 激情四房婷婷| 欧美国产日韩一区二区| 97在线视频免费播放| 美女在线观看视频一区二区| 国产999精品在线观看| 久操成人av| 精品国产黄a∨片高清在线| 国产亚洲精品久久久久久移动网络| 美腿丝袜一区二区三区| 久久先锋影音av鲁色资源| 全部免费的黄色毛片| 国产成人亚洲综合a∨猫咪| 91精品人妻一区二区三区蜜桃欧美| 最新欧美电影| 午夜久久一区| 欧美亚洲国产视频小说| 亚洲国产一区二区在线观看| 免费成人三级| 欧美自拍偷拍午夜视频| 狠狠干狠狠搞| 日韩a视频在线观看| 亚洲欧美日韩在线一区| 精品人妻一区二区三区三区四区| 亚洲不卡1卡2卡三卡2021麻豆| 免费不卡在线观看| 欧美人成在线视频| 国产日韩欧美一区二区东京热| 日韩av在线播| 日韩av免费电影| 国产精久久一区二区三区| 亚洲成人av片在线观看| 午夜影院免费视频| 国产经品一区二区| 国产无遮挡在线视频免费观看| 黄色av网站在线| 超碰在线观看免费版| 热舞福利精品大尺度视频| 欧美日韩xxxxx| 欧美大成色www永久网站婷| 高清性色生活片在线观看| 在线女人免费视频| 国产精品成人无码免费| 在线观看中文字幕2021| 日韩精品――中文字幕| 亚洲欧美日韩国产手机在线| 国产5g影院天天爽天天看| 久久久老熟女一区二区三区91| 欧美三电影在线| 日本高清免费在线视频| www.日韩av.com| 日韩视频二区| 国产精品一级视频| 欧美爱爱视频| 欧美精品黄色| 日本性爱视频在线观看| 国产精品手机播放| 日韩在线观看一区二区| 欧美噜噜久久久xxx| 亚洲人metart人体| 亚洲精品成人悠悠色影视| 特级西西444www| 久久精品国内一区二区三区| 久久成人亚洲| 国产精品成人69xxx免费视频| 国产偷久久久精品专区| 91在线你懂得| 久久久资源网| 久久精品国产亚洲夜色av网站| 特黄aaaaaaaaa毛片免费视频| 国产综合在线播放| 免费看涩涩视频软件| 亚洲精品视频网址| 中文字幕欧美一区二区| 亚州精品国产| 另类视频欧美| 日韩污视频在线观看| 国产99久久| 日本爱爱小视频| 好爽好深好紧好大| 日本一级片免费| 国产一级电影网| 欧美性大战久久久久xxx| 91网址在线看| 青青草偷拍视频| 伊人色综合久久久| 韩国三级hd中文字幕有哪些| 亚洲欧洲精品在线| 日韩欧美视频一区| 亚洲精选成人| 国产精品xxx在线观看| 能在线观看av网站| aa成人免费视频| 亚洲美女精品久久| 91精品国产91久久久久久不卡| 精品爆乳一区二区三区无码av| 婷婷丁香综合网| 午夜视频免费在线观看| 四虎激情影院| 日本在线观看大片免费视频| 亚洲 欧美 日韩 国产综合 在线| 久久精品欧美一区二区三区不卡| 日韩精品久久久久久久玫瑰园| 亚洲欧美区自拍先锋| 黄色福利在线观看| 精品久久久精品| 黄色国产一级视频| 免费观看羞羞视频网站| 久久久www成人免费无遮挡大片| 91理论片午午论夜理片久久| 嫩草影院网站在线| 夜夜嗨av色综合久久久综合网| 黄色片在线看| av日韩一区二区三区| 欧美黑人巨大xxxxx| 毛片在线看片| 成人午夜电影网站| 亚洲乱码一区二区三区| 欧美黑粗硬大| 三级全黄的视频在线观看| 国产69精品久久777的优势| 91九色蝌蚪| 国产成人精品福利| 日日骚一区二区三区| 激情综合激情| 久久久久久久久久久久久久国产| 国产专区在线视频| av女片在线| 一区二区成人在线视频| 日韩一级大片在线观看| 伊人国产在线观看| 一个人在线观看免费视频www| av色男福利网| 国产综合久久久久久久久久久久| 欧美成人milf| 香蕉av在线播放| 四虎影视最新网站入口在线观看| 色撸撸在线观看| 99久久99热这里只有精品| 在线观看中文字幕不卡| 亚洲我射av| 久久91亚洲精品中文字幕| 久久露脸国语精品国产91| 领导边摸边吃奶边做爽在线观看| 国产精品国产三级国产aⅴ中文| 中文天堂网在线www| 黄色一级片在线| 丁香花视频在线观看| 免费成人蒂法网站| 制服丝袜第一页在线观看| 不卡一区二区三区四区| 国产原创精品视频| 国产人成在线视频| 91女人视频在线观看| 久久影院午夜精品| 亚洲精品自拍动漫在线| 97视频在线观看视频免费视频| 免费看日本毛片| 91国内免费在线视频| 亚洲视频狠狠干| 国产精品一二二区| 人妻 丝袜美腿 中文字幕| 日韩写真在线| 成人欧美一区二区三区白人| 亚洲成人精品女人久久久| 2019中文字幕在线免费观看| 国产激情在线视频| 日韩精品福利网站| 国产精品成人观看视频免费| 欧美手机在线视频| 一区二区三区四区视频在线观看| 欧美一区二区三区久久精品| 国产精品视频你懂的| 亚洲精品国产成人av在线| 亚洲一区二区三区免费在线观看| 夜夜操夜夜操| 成人精品国产福利| 久久久精品国产99久久精品芒果| 色狠狠久久aa北条麻妃| 九色porny丨国产精品| 麻豆精品精品国产自在97香蕉| av永久免费观看| 午夜精品免费看| 欧美第一视频| 黄色网址大全在线观看| 激情综合网激情| 成人xxxxx| 亚洲大片在线| 欧美一二区在线观看|