linuxÏÂʵÏÖSNIFFER¹¦ÄÜ
´ó¼ÒºÃ£¬ÎÒ¸ÕѧϰLINUX±à³Ì£¬±àÁËÒ»¸öС³ÌÐò£¬Ö÷Òª¹¦ÄÜÊÇÏë´´½¨Ò»¸öSOCKECT£¬È»ºó°ó¶¨µ½±¾µØÍø¿¨ÉÏ£¬½ØÈ¡ËùÓÐͨ¹ý±¾Íø¿¨µÄÊý¾Ý°ü£¬È»ºó´òÓ¡³öÀ´¡£µ«ÊdzÌÐòÖ´Ðе½revcµÄwhileÑ»·µÄʱºò£¬¾ÍһֱͣÔÚÄÇÀ½ÓÊÕ²»µ½Êý¾Ý£¬²»ÖªµÀÊDz»ÊÇÇ°ÃæÊ²Ã´µØ·½ÉèÖôíÁË£¿Çë´ó¼ÒÖ¸µã¡£
³ÌÐòÈçÏ £º
#include<stdio.h>
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#include<fcntl.h>IwX)wF9gr!A
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/types.h>p+}DC@:Aw
#include<stdlib.h>(M7Hh]&vZn.y
#include<errno.h>
#include<unistd.h>
#define N 1024
#define M 1024Rc Z L9nl'q L
typedef struct _IP{#m0V0Z)G.~
union{ uint8_t Version;
uint8_t HdrLen;};
uint8_t ServiceType;
uint16_t TotalLen;)q%}J#mO%T
uint16_t ID;7NZi7~ubP+QGH8g
union{uint16_t Flags0;uint16_t FragOff;};
uint8_t TimeToLive;
uint8_t Protocol;w)qNN0X-zj
uint16_t HdrChksum;q:EGf;|
uint32_t SrcAddr;+?q,O-Z*A"t*Um
uint32_t DstAddr;
}IP;
typedef struct _TCP] b1m hL_NmG[
{+z@.S&w)?.j } H
uint16_t SrcPort;L-v ? z@1L#y&G*acE
uint16_t DstPort;YW)[9j*{7d0Q
uint32_t SeqNum; [ V$I4V(_kAf8q
uint32_t AckNum;
uint8_t DataOff;9u:sP1[:}X
uint8_t Flags1;1`?(i0u;@[A%S:@h
uint16_t Window;
uint16_t Chksum;*}tO9Zp!nN3E!l
uint16_t UrgPtr;0Qc9\o_&j9NiI
}TCP;
IP ip;
TCP tcp;
int printer(IP ip)
{
uint8_t version;/r;Ya cP!Z e'Vf){)`
uint8_t hdrlen;8]J E;v9V)c
uint8_t DF,MF;
uint16_t foff;
version=ip.Version>>4; tY2J*h+gZ{
hdrlen=(ip.Version&0x0f)*4;I KyIT"o
DF=(ip.Flags0>>14)&0x01;
MF=(ip.Flags0>>13)&0x01;
foff=ip.Flags0&0x1fff;1_vK;fU:?H6d^
,L4uG,P(DtXW
printf("Version:%d\r\n",version);d$gc/rw,X2GxO
printf("Herd length:%d\r\n",hdrlen);%Xp;~9D:{b f
printf("datapack length:%d\r\n",ntohs(ip.TotalLen));
printf("ID:%d\r\n",ip.ID);
printf("flag:%s\r\n",inet_ntoa(ip.Flags0));$U G+p y1M"krC
printf("segment :%d\r\n",foff);
printf("timetolive:%d\r\n",ip.TimeToLive);jE(k?WY'_DnL
printf("header check:%d\r\n",ip.HdrChksum);
printf("ip source:%s\r\n",inet_ntoa(ip.SrcAddr));0G,S9xKB:v;h
printf("ip dest:%s\r\n\r\n\r\n",inet_ntoa(ip.DstAddr));
return 0;'D6We~$m[4[6]
}
int main()
{
struct sockaddr_in addr_in;
const int BUFFER_SIZE=65535;
int flag=1;e)F"ht ]0@#J? h
char LocalName[256];
struct postent * pHost;
char RecvBuf [BUFFER_SIZE];*[ R.\t [b(P-zU6sr q7\
IP ip;
int sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);j,X7eL;?+B [I4k E
printf("sock=%d\n",sock);
int rc=setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag));
if(rc<0)
{I6o&F6B?
printf("%d\n",rc);
printf("setsockopt fail!\n");'k^4J`s
}
if(0!=gethostname((char*)LocalName,sizeof(LocalName)-1))//»ñÈ¡±¾µØIPµØÖ·Ãû1VF)D$ejN7z$N%_MI
{1J J7|4cU_YA
printf("gethostname fail!\n"); a"| Ni8[
}
else
{
printf("hostname=%s!\n",LocalName);)|7U5x^L0] D
}gwi0F.jeuQuOo`
addr_in.sin_addr.s_addr=inet_addr("172.16.22.23");//±¾µØIPµØÖ·(C:O9q+]U"r.[(jb:dF
addr_in.sin_family=AF_INET; {/b+LA)oa#{F'H(C |
addr_in.sin_port=htons(45882);9c8wqc9OU!l
ct']3E V~X
if(0!=bind(sock , (struct sockaddr * )&addr_in,sizeof(addr_in)))
{
printf("bind failed!\n");
} p2J&X.Sw%O+N`:Z
if(0!=fcntl(sock,F_SETFL,O_NONBLOCK))//ÉèÖÃÍø¿¨½ÓÊÕËùÓÐͨ¹ý±¾Íø¿¨µÄÊý¾Ý°üF ak`.t0Op
{ printf("ioctlsocket failed!\n");}
socklen_t len;
while(1)wP @2AA*^5aU(}
{3a!KLssn%h%pi
int ret=recv(sock,RecvBuf,BUFFER_SIZE,0);
if(ret>0)
{.r.JB9AP
ip=*(IP*)RecvBuf;2a/Zg:?m"HF
tcp=*(TCP*)(RecvBuf+ip.HdrLen);
printer(ip);T&RFCcbr#N2D1x
printf("%d\n",ret);;WX-r x ?q3x
} p+}? }f+Y)Tv M
else if(ret==0)
{
printf("the connection has been gracefully close!\n");
} 'R$X4K Q'^a^*z4vmjP y-\
}
} Èç¹ûËÓÐÕâ·½ÃæµÄÔ´´úÂ룬Âé·³¿ÉÒÔ·¢¸øÎÒÒ»·Ýô£¿ÈÃÎÒѧϰһÏ¡£¡£¡£²»Ê¤¸Ð¼¤¡£ ËÆºõÓ¦¸ÃÉèÖÃÍø¿¨Îª»ìÔÓģʽ£¿
ÓÃifconfig¿´¿´£¿
Ò³:
[1]