请高手指教:终端如何截获目的地址不是本机的数据包!

发表于:2007-05-26来源:作者:点击数: 标签:
我用raw_socket做,但它只能接受目的地址是本机的数据报 流套接字和UDP套接字就更不可能了 无双 回复于:2003-07-19 23:02:19 raw_socket应该是只能接收到IP层的包 因为本机发出的包是走发送缓冲区 所以使用RAW——SOCKET不可以接收到 SNIFFER是监听 底层的

我用raw_socket做,但它只能接受目的地址是本机的数据报
流套接字和UDP套接字就更不可能了

 无双 回复于:2003-07-19 23:02:19
raw_socket应该是只能接收到IP层的包

因为本机发出的包是走发送缓冲区
所以使用RAW——SOCKET不可以接收到

SNIFFER是监听
底层的广播包 可以得到数据库连路层包 所以在以太网中可以得到

 蓝色键盘 回复于:2003-07-18 11:22:21
FAQ中有连接,也有代码。

 grrrr120 回复于:2003-07-18 11:27:08
FAQ是什么地方
请斑竹写具体一点

 蓝色键盘 回复于:2003-07-18 11:34:09
置顶FAQ

看见了吗?是汉字的写的标题

 grrrr120 回复于:2003-07-18 12:01:12
大致看了一下
好像没有这方面的内容

其实我是想在没有转发功能的几个主机之间实现数据的转发
主机内部已经通过程序产生了路由表

 蓝色键盘 回复于:2003-07-18 14:44:42
论坛中有的是代码,可以参考

对于RAW_socket接受来说:
1、对于tcp和udp报文分组,是不会传递给raw的。如果非要去读的话,考虑从数据链路层读取。
2、调用scoket函数的第三个参数是否置顶,并且和发送方一致。
3、发送者在connect你的过程中,指定的RAW是不是你的本地IP。

 grrrr120 回复于:2003-07-18 15:11:43
那又怎么样读取底层(数据链路层)的报头呢?

 蓝色键盘 回复于:2003-07-18 15:20:46
看看snifer相关的东东。

网上这方面的代码和资料汗牛充栋。

 mengwg 回复于:2003-07-20 09:25:08
[code:1:a84d0c650e]
#ifdef LINUX_SYS

#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/utsname.h>
#include <net/if.h>
#include <netinet/in.h>
#include <linux/if_ether.h>
#include <netinet/if_ether.h>
#include <netpacket/packet.h>
#include <net/if.h>
#include <netinet/in.h>

int Linux_Cap_All_Ip(char * local_ip,int (* lookup_handle)(TNetProt * pnetprot))
{
int sock_fd = -1;
unsigned char buf[4096];
int bytes;
struct sockaddr from;
int id,toshownum,self_finded=0,find_self_num=0,find_self_str_len;
socklen_t_type fromlen;
int fcode;
TNetProt send_pack;
char self_src_ip[30],self_tag_ip[30];
int  self_src_port,self_tag_port;

struct ifreq ifr;
struct packet_mreq mr;

sock_fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL));
  if(sock_fd<0)
    return 0;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name,"eth0", sizeof(ifr.ifr_name));
if(ioctl(sock_fd, SIOCGIFFLAGS, &ifr)<0)
  {
    printf("iocetl get error\n");
    return 0;
  };
ifr.ifr_flags |= IFF_PROMISC;
if(ioctl(sock_fd, SIOCSIFFLAGS, &ifr)==-1)
  {
    printf("set promisc error");
    return 0;
  }
  while(1)
  {
   bytes = recvfrom(sock_fd,buf,4096, MSG_TRUNC,(struct sockaddr *) &from, &fromlen);
    if(bytes<=0) continue;
    if(!send_pack.Unpack_Ip(buf,bytes))
      continue;

    if(lookup_handle!=NULL)
    {
      if(!(*lookup_handle)(&send_pack))
        break;
      continue;
    };
    printf("srcip %15s tagip %15s ipprot %2d\n",
      send_pack.mPack.Ip_Src,send_pack.mPack.Ip_Tag,send_pack.mPack.Ip_Protocol);
};
  return 1;
};
#endif

[/code:1:a84d0c650e]

 无双 回复于:2003-07-20 10:19:38
可以用吧
那加精了

 ohwww 回复于:2003-07-20 20:59:56
学习,最近刚想作个取所以可以检测到的网络数据包的程序,用c++builder做.希望这个可以用

 mengwg 回复于:2003-07-20 21:00:58
[quote:978047deea="ohwww"]学习,最近刚想作个取所以可以检测到的网络数据包的程序,用c++builder做.希望这个可以用[/quote:978047deea]     

用c++builder做.这个不能用,需要修改的

 无双 回复于:2003-07-20 21:42:57
CB和VC使用socket前都是加WSAStarup

另外就是sniffer因为是与底层相关的
所以每个平台都会有区别

不像socket那样是有统一标准

 ohwww 回复于:2003-07-21 12:03:04
哦,我今天看到一个软件winpcap,好像能协助来抓包,而且是所有的包,可是对这个东西不是很理解.大家可以找来用一下

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)