大家好,我刚学习LINUX编程,编了一个小程序,主要功能是想创建一个SOCKECT,然后绑定到本地网卡上,截取所有通过本网卡的数据包,然后打印出来。
6C'Vd&Z5Q:j5|)yp
但是程序执行到revc的while循环的时候,就一直停在那里,接收不到数据,不知道是不是前面什么地方设置错了?请大家指点。
6zVN9Y_4ZM程序如下 :
www.linuxeden.comef7\,C5v3^ G,w{L
#include<stdio.h>
vp @5F|@#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
^qn@gh
#include<fcntl.h>
:N9Hm.i+Z.k8k C]3lwww.linuxeden.com#include<sys/socket.h>
#Z@jn3^}
ksC
#include<netinet/in.h>
www.linuxeden.com2hcxV!xO
#include<string.h>
z+dg2tXH6_
S$FC
#include<sys/types.h>
www.linuxeden.com`1`4Xj[+`
#include<stdlib.h>
Vt]rV)kYA
#include<errno.h>
/gKz5e){"O#include<unistd.h>
KYV Zi
ow&R#define N 1024
'fA:t
vm8y9yp
gQ2|
#define M 1024
_%h'f"H$m m.kAtLinux伊甸园论坛typedef struct _IP{
z[e(LQaunion{ uint8_t Version;
Linux伊甸园论坛9@)[!z?
? JG V
uint8_t HdrLen;};
www.linuxeden.comHk&jI%nQ6wRt
uint8_t ServiceType;
www.linuxeden.comSVzE-Tw
uint16_t TotalLen;
Linux伊甸园论坛#_Bl Zxp6F:l
uint16_t ID;
.i3l}"e d
tco union{uint16_t Flags0;uint16_t FragOff;};
'bya-b)e9u$ylc
uint8_t TimeToLive;
T9D8a'u&rY@
]"Y uint8_t Protocol;
.LT(Y%].\6_7|DrD9Owww.linuxeden.com uint16_t HdrChksum;
p)L*X Af?Linux伊甸园论坛 uint32_t SrcAddr;
b!P,n+yb6O uint32_t DstAddr;
q0px/o5Re;mj
}IP;
www.linuxeden.com'BZB&A;w.W
typedef struct _TCP
C7]$yyYP
T_p{
6Xxi|u&J
uint16_t SrcPort;
Vx.US{,d uint16_t DstPort;
F
fNu$j
t
uint32_t SeqNum;
#d-}3XK EY @&I uint32_t AckNum;
mRy.?4j:RQ uint8_t DataOff;
'It!x+P,~(Bz,LH
uint8_t Flags1;
Linux伊甸园论坛ew7RX`
n.V
Rs
uint16_t Window;
Linux伊甸园论坛KiDW
}uE)E
uint16_t Chksum;
-D,LNQ` uint16_t UrgPtr;
UvD)oD}TCP;
0q~+}6X0w0l;gjwww.linuxeden.comIP ip;
r+Dv,n5h
TCP tcp;
/q$r9H4E[FJu'e5{cint printer(IP ip)
-`F1||(Fvwww.linuxeden.com{
)E)]
f#kc^'v uint8_t version;
www.linuxeden.comc$H&oJZ"{%Ne
uint8_t hdrlen;
Linux伊甸园论坛`
?Z&YIGi2c~X
uint8_t DF,MF;
www.linuxeden.comS,y4fJ8] lD2H
uint16_t foff;
www.linuxeden.com]7@3DD)TsD!P
version=ip.Version>>4;
M[0?.u-X&c2_
hdrlen=(ip.Version&0x0f)*4;
www.linuxeden.comj A/X7MlT;w.LY
DF=(ip.Flags0>>14)&0x01;
%Y&Il,WQ8vBSwww.linuxeden.com MF=(ip.Flags0>>13)&0x01;
3bp]D9Z-ELinux伊甸园论坛 foff=ip.Flags0&0x1fff;
9y-j ^8x)H Linux伊甸园论坛$BmI?Zi7J{
printf("Version:%d\r\n",version);
/K:|er:[T-` printf("Herd length:%d\r\n",hdrlen);
5\qLB:OVb
printf("datapack length:%d\r\n",ntohs(ip.TotalLen));
Linux伊甸园论坛IE)eXM/XvbpueD
printf("ID:%d\r\n",ip.ID);
["}TS7OA printf("flag:%s\r\n",inet_ntoa(ip.Flags0));
#A0Un3l3n6^8t/[?
printf("segment :%d\r\n",foff);
Linux伊甸园论坛:wX9s
~4d
printf("timetolive:%d\r\n",ip.TimeToLive);
Linux伊甸园论坛(x6{*~F)P-^C_C(N
printf("header check:%d\r\n",ip.HdrChksum);
.Nh*qr&z h
B printf("ip source:%s\r\n",inet_ntoa(ip.SrcAddr));
q2E%g{1os-R`2B printf("ip dest:%s\r\n\r\n\r\n",inet_ntoa(ip.DstAddr));
www.linuxeden.comn$Lmg{?,y
return 0;
~ bOUE {}
BO2v-H~
QE cint main()
Linux伊甸园论坛
V&n&o2`!? \qz-r
{
5cKict3~1m}RB|
struct sockaddr_in addr_in;
M^%J-V c{q~
const int BUFFER_SIZE=65535;
LTbQ#q2Lh5J int flag=1;
5fa1UM6ku4n\t char LocalName[256];
`q:Rv&P9A
struct postent * pHost;
f:_maX8y} V char RecvBuf [BUFFER_SIZE];
Linux伊甸园论坛H
'Y,G8T R
IP ip;
@#^'`T'E
r*vn
b3I`
RR9Qx int sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
6W(~8~Dg G
printf("sock=%d\n",sock);
6Ac1E'uDZJ Ewww.linuxeden.com int rc=setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag));
{#b,gwQ1Y^0n8v
if(rc<0)
7u%^a2Z
rX
{
tJVX
T2Gwww.linuxeden.com printf("%d\n",rc);
!Hn
F8wfw.^)W
printf("setsockopt fail!\n");
Linux伊甸园论坛.C(`:wCl6B'\7I)l
}
[8_-R`
_G if(0!=gethostname((char*)LocalName,sizeof(LocalName)-1))//获取本地IP地址名
-[&lR7?E*Rd {
Q1U-u4B$`\g:]8{
printf("gethostname fail!\n");
[6}*_0@P(m }
Awt^5n({p
else
$a'uD5I9yX7R {
*e.B[z9F printf("hostname=%s!\n",LocalName);
;_G;Z+Y_,_3z }
|Y2}%k
v
o8O8nwww.linuxeden.com addr_in.sin_addr.s_addr=inet_addr("172.16.22.23");//本地IP地址
!_3N;sF GYz#D addr_in.sin_family=AF_INET;
www.linuxeden.comR
j.hN1fbc_1@
addr_in.sin_port=htons(45882);
0M;FN9P.HIt9T
yd^2D@f3EY Zl l if(0!=bind(sock , (struct sockaddr * )&addr_in,sizeof(addr_in)))