我想实现的功能是:启动一个应用程序之后全权接管一个硬件网卡的收发数据。应用程序能够到网卡内存里(或网卡与系统接口之间,总之不能是系统内存里缓存的数据包)接收所有该网卡收到的网络传输层数据,同时也能够自己组数据包直接交给网卡发送.
请问该怎样实现这样的功能,要用到驱动编程吗?用winpcap能不能实现,怎样实现呢,请各位帮帮忙,很急!!

解决方案 »

  1.   

    不用写驱动,直接用socket编程就行,首先的把网卡设为混杂模式,然后创建接收链路层所有数据包的套接口,socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)),然后直接recvfome and sendto 就行了。
      

  2.   

      楼上说得不对。你如果想直接给网卡发数据,就是需要驱动编程的。用原始套接字(就是楼上说的SOCK_RAW方式),也是要经过操作系统(比如说windows)的tcp/ip协议栈的,依赖于具体的操作系统。
      而wincap其实也是一个软件层,wincap能不能用,具体要看楼主需要实现哪些功能?
      

  3.   

    就是要实现启动应用程序后,直接从网卡的内存中读取数据包,发送数据时,直接发送到网卡内存里,而不用依赖具体的操作系统.
    目前我用winpcap所实现的程序,只能从windows系统的缓存里读取网卡接收来的数据,所以,所接收来的数据都是在当前系统时间之前的数据来的而不是实时的数据.
      

  4.   

    不知道你说的实时是个什么概念,要知道不管怎么样都是有多少延时的,用pcap的话,可以把超时的时间设置短一点,达到尽可能接近“实时”winpcap只是起到发包、分析、嗅探的作用,至于你说的接管,恐怕做不到,你可以看下winpcap的开发文档
      

  5.   

    wincap也是微软提供的上层软件层的东西,你要是想直接读网卡的数据,只能从驱动入手。而且windows的网络驱动还分3层,从上往下是协议驱动,中间层驱动,微端口驱动。收到的数据是一层一层上来的,之后协议驱动会把数据交给上层协议栈,比如tcp/ip协议栈。
      

  6.   

    楼主理解的有点问题,系统可以接收到实时的数据,raw socket就可以接收到原始的数据包,分析数据包模拟数据包发送这个就像以前我弄过的游戏脱机外挂一样
    不用复杂到做驱动,如果你做驱动的话,实现你所说的功能还需要自己做协议栈,很麻烦
      

  7.   

    我就是用winpcap写了个接收数据的程序,比如说,现在我的系统时间是15:06:10,而我的程序接收到的数据所显示的时间却是15:04:20,就是说,接收到的数据是系统缓存里的过时了的数据了,而不是此刻所接收到的数据.
    int receiveIPv4(u_char desIP[4])///////////存在的问题:当接收不到对应的arp应答包时,不会自动停止并跳出循环
    {
    int res=0;
    int i=0,j=0;
    int count=0;
    struct tm *ltime=NULL;
    char timestr[16]={0};
        time_t local_tv_sec=NULL;
    startSendEmptyCommand(desIP,num);
    while((res = pcap_next_ex( fp, &header, &pkt_data)) >= 0)
    {
    if(kbhit())//按下任意键结束接收数据
    {
    printf("已停止接收信息\n");
    fprintf(log,"已停止接收信息\n");
    fprintf(message,"已停止接收信息\n");
    break;
    }
    if(res == 0)/* Timeout elapsed */
    {
    startSendEmptyCommand(desIP,num);
    continue;
    }
    pIpHead ip=(pIpHead)pkt_data;
    //如果协议不同,且ip包来源的IP地址与该从机的IP地址不同,且ip包发送目的不是主机 就不能通过
    if( ntohs(ip->eh_type)==0x0800 )
    { /* 将时间戳转换成可识别的格式 */
    local_tv_sec = header->ts.tv_sec;
    ltime=localtime(&local_tv_sec);
    strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
    printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);
    printf("从机IP:");
    printIP(ip->ip_src);//打印源IP地址
    printf("      ---->  ");
    printf("主机IP:");
    printIP(ip->ip_dst);//打印目的IP地址          
    for (i=1; i<(header->caplen+1)-2; i+=2)//43开始为正直有用的数据
    {
    printf( "%d ",pkt_data[i-1]); if ( ( (i % 16 )== 0 )  
                                               printf("\n");
    }
    printf("\n\n");
    Sleep(100);////////
    startSendEmptyCommand(desIP,num);
    }
    else
    {
    startSendEmptyCommand(desIP,num);
    continue;
    } }//end while
    if(res == -1)
    return -1;
    return 0;
    }这个就是我写的接收数据包的函数,那个pkt_data指针里指向的数据包会出错.也就是说,如果我不直接向网卡发送数据包和读取数据包,那么,我就不能够确定我要发送的数据包是否马上发送了出去,也不能确定我此刻收到的数据包的时间戳是当前系统的时间.
      

  8.   


    你错了,winpcap是驱动,不是上层软件层的东西,可以跨平台使用的,不仅仅适用于windows平台
    LZ用pcap怎么会有2分钟的延时?我倒是没有多少延时,也就10毫秒左右吧
      

  9.   


    恩,我刚才查了查,wincap确实是属于协议驱动的东西,我一般是自己写简单的协议驱动的,没有用过wincap,只是听说wincap是微软开发的独立于tcp/ip协议栈的类库,所以以为也是软件层的东西呢,谢谢纠正!
      

  10.   

    我也在寻求解决这个问题的办法,如果透过Windows操作系统直接读取网卡接收的数据,我想应该必须依赖底层驱动吧?关键是这个驱动应该怎样写?
      

  11.   

    我也正在找学习这方面的东西,我遇到的问题是:我用Socket的recvfrom接收到的数据与用Wireshark软件接收的数据不同,不知道这两者之间有什么区别?