主机发送数据到网络,是不是要再经过交换机转发的?我原本打算使用SOCKET RAW捕获本机所有发送数据,后来我发现无法捕获发往未上线IP主机或发往本机的数据,1.我估计应该是网卡过滤掉,但我不确认,谁有讲网卡通信原理规则的资料?2.如果我想实现捕获所以放送的数据(不用对方应答),是不是使用SOCKET RAW不能实现?又该如何实现呢?

解决方案 »

  1.   

    1.对于交换机网络,Raw socket不能捕获数据包..
    2.需要把抓包程序做到交换机上
      

  2.   

    把网卡置于混杂模式,用raw socket捕获数据包
      

  3.   

    我现在的做法就是
    就是:网卡设置为混杂模式  用原始套接字 socket(AF_INET, SOCK_RAW, IPPROTO_RAW)
      dwValue = 0x0001;
      //设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包
      if (ioctlsocket(sock, SIO_RCVALL, &dwValue) != 0)现在存在的问题就是
    当我使用IPPROTO_RAW时,就没受到任何数据;
    使用IPPROTO_IP时,则无法收到源IP和目的IP均为本机的数据包。
    另外有个奇怪的问题:
    我做2个程序:(使用BCB6.0,控件:TNMUDP)
    A:用来往本机发送UDP数据;
    B:用来接收UDP数据,
    且A的目的端口和B的接受端口相同。当我先启动B,再启动A发送数据时,B能收到数据;
    但是反之则不行,这又是怎么回事呢?
      

  4.   

    B是服务端,当然要先启动,不然A启动的时候,连接B,而这时候B没有启动,A不能连接成功,发送数据失败
      

  5.   

    raw socket只能捕获IP协议的数据包,比如TCP、UDP、ICMP等。显然不能满足LZ的“所有数据”的要求。要捕获所有数据,需要从驱动里获得,比较好的开发库是winpcap
      

  6.   


    用winpcap库吧,不但一开源,而且能捕捉到数据链路层的帧。
      

  7.   

    ndis中间层驱动 ndis协议驱动 winpcap
      

  8.   

    解决了,不用使用SOCKET RAW的。使用SOCKET就可以获取本地发送的UDP数据了。
      

  9.   


    UDP发送是不用BIND()的,只有接受端要BIND(),所以无所谓先后。我找到的原因是:我使用了3个TNMUDP控件,发送端和接受端都有发送的控件,导致了发送失败,而控件屏蔽了这个消息,所以收不到消息。