本帖最后由 oyljerry 于 2011-09-20 17:29:04 编辑

解决方案 »

  1.   

    抓包的时候有没有设置过滤条件?是不是把自己的IP地址给过滤掉了.或者说是具体到某种协议,比如TCP,而你机器上当时正好没有用TCP通信的软件.
      

  2.   


    只是查看经过本地网卡的流量
    我贴下代码吧:BOOL flag=TRUE;
    if (setsockopt(sRaw, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == SOCKET_ERROR)
    {
    printf("setsockopt IP_HDRINCL error!\n");
    return ;
    }
    // 设置SIO_RCVALL控制代码,以便接收所有的IP包
    DWORD dwValue = 1;
    if(ioctlsocket(sRaw, SIO_RCVALL, &dwValue) != 0)
            return ;//解析封包,其实就是查看源地址和目的地址而已
    void DecodeIPPacket(char *pData)
    {
    IPHeader *pIPHdr = (IPHeader*)pData;
    in_addr source, dest;
    char szSourceIp[32], szDestIp[32];  printf("\n\n-------------------------------\n"); // 从IP头中取出源IP地址和目的IP地址
    source.S_un.S_addr = pIPHdr->ipSource;
    dest.S_un.S_addr = pIPHdr->ipDestination;
    strcpy(szSourceIp, ::inet_ntoa(source));
    strcpy(szDestIp, ::inet_ntoa(dest)); printf(" %s -> %s \n", szSourceIp, szDestIp);
    // IP头长度
    int nHeaderLen = (pIPHdr->iphVerLen & 0xf) * sizeof(ULONG); switch(pIPHdr->ipProtocol)
    {
    case IPPROTO_TCP: // TCP协议
    printf("TCP\n");
    DecodeTCPPacket(pData + nHeaderLen);
    break;
    case IPPROTO_UDP:
    printf("UDP\n");
    break;
    case IPPROTO_ICMP:
    printf("ICMP\n");
    break; 
    }
    }
      

  3.   

    可以去看看广播和多播,至于单播,你只能收到发送给自己的,除非你用的是HUB,而非SWITCH