我尝试在Linux下使用原始套接字捕获网络程序包。
有时这行得通。看来我可以捕捉到部分对话,但不能全部捕捉。
我创建一个套接字:
sock = socket( PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
然后我通过以下方式将其绑定(bind)到eth0:
struct sockaddr_ll sll;
struct ifreq ifr;
memset( &sll, 0, sizeof( sll));
memset( &ifr, 0, sizeof( ifr));
strcpy( ifr.ifr_name, "eth0");
if(( ioctl( sock, SIOCGIFINDEX, &ifr))==-1)
{
printf( "error\n");
return(-1);
}
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons( ETH_P_ALL);
bind( sock, (struct sockaddr*)&sll, sizeof( sll));
然后我尝试接收:
int packetsize = 65535;
char packet[packetsize];
struct ether_header *eth = (struct ether_header *) packet;
struct iphdr *ip = (struct iphdr *) (packet + sizeof(struct ether_header));
struct tcphdr *tcp = (struct tcphdr*) (packet+sizeof( struct ether_header)+sizeof( struct iphdr));
struct udphdr *udp = (struct udphdr*) (packet+sizeof( struct ether_header)+sizeof( struct iphdr));
int k;
while(1)
{
k = read( sock, packet, sizeof( packet));
if( k>0)
{
if( ntohs( eth-> ether_type) == 0x0800)
{
inet_ntop( AF_INET, &ip->saddr, source, 16);
inet_ntop( AF_INET, &ip->daddr, dest, 16);
switch (ip->protocol)
{
case 6://TCP
printf( "TCP: %s:%d -> %s:%d\n", source, ntohs( tcp->source), dest, ntohs( tcp->dest));
break;
case 17://UDP
printf( "UDP: %s:%d -> %s:%d\n", source, ntohs( udp->source), dest, ntohs( udp->dest));
break;
default:
break;
}//switch
}// if 0x800
}//if( k>0)
}//while
我可以捕获网络中的某些数据包,但不是全部。
看来我很想念两方之间的整个对话。
有人有想法吗,我做错了什么?
提前致谢
短剑
最佳答案
除非这是某种家庭作业练习或受虐狂练习,否则我强烈建议您使用libpcap
,它可以提供一种便携式的方式来解决已被考验到死亡的问题。 libpcap
是tcpdump
和wireshark
在后台使用的功能。
关于c++ - C/C++中Linux下的Packet Sniffer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22206791/