我想实现的功能是:启动一个应用程序之后全权接管一个硬件网卡的收发数据。应用程序能够到网卡内存里(或网卡与系统接口之间,总之不能是系统内存里缓存的数据包)接收所有该网卡收到的网络传输层数据,同时也能够自己组数据包直接交给网卡发送.
请问该怎样实现这样的功能,要用到驱动编程吗?用winpcap能不能实现,怎样实现呢,请各位帮帮忙,很急!!
请问该怎样实现这样的功能,要用到驱动编程吗?用winpcap能不能实现,怎样实现呢,请各位帮帮忙,很急!!
而wincap其实也是一个软件层,wincap能不能用,具体要看楼主需要实现哪些功能?
目前我用winpcap所实现的程序,只能从windows系统的缓存里读取网卡接收来的数据,所以,所接收来的数据都是在当前系统时间之前的数据来的而不是实时的数据.
不用复杂到做驱动,如果你做驱动的话,实现你所说的功能还需要自己做协议栈,很麻烦
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指针里指向的数据包会出错.也就是说,如果我不直接向网卡发送数据包和读取数据包,那么,我就不能够确定我要发送的数据包是否马上发送了出去,也不能确定我此刻收到的数据包的时间戳是当前系统的时间.
你错了,winpcap是驱动,不是上层软件层的东西,可以跨平台使用的,不仅仅适用于windows平台
LZ用pcap怎么会有2分钟的延时?我倒是没有多少延时,也就10毫秒左右吧
恩,我刚才查了查,wincap确实是属于协议驱动的东西,我一般是自己写简单的协议驱动的,没有用过wincap,只是听说wincap是微软开发的独立于tcp/ip协议栈的类库,所以以为也是软件层的东西呢,谢谢纠正!