阅读:1679回复:10
请教asmsys有关ddk中的packet例子
您好,我想向你请教一下ddk中的\\NTDDK\\src\\network\\ndis\\packet这个例子,我将它改成循环抓包,结果丢包很严重,应该如何改进呢?
打扰你呢,非常感谢 我冒昧给你发了封信,不知你能否收到 我的email:lijun0623@163.com |
|
沙发#
发布于:2004-04-05 09:27
注意一下serialize 和Deserialized的问题,丢包一般是这个问题。
下面是DDK的说明,也许对你有帮助。 NDIS assumes that all connection-oriented miniports are deserialized drivers, regardless of the AttributeFlags that they pass to NdisMSetAttributesEx. That is, any driver that calls NdisMRegisterMiniport with 0x05 as the MajorNdisVersion must be a deserialized miniport。 |
|
板凳#
发布于:2004-04-05 09:52
我是将packet编译后直接使用其产生的packet.sys和packet.c中的函数,这是不是意味着丢包问题解决不了了?
|
|
地板#
发布于:2004-04-05 09:56
你不是“我将它改成循环抓包”了吗?
|
|
地下室#
发布于:2004-04-05 10:56
是调用packet。sys,将packet。c中的PacketReceivePacket放在一个循环结构中
|
|
5楼#
发布于:2004-04-05 11:14
那就注意返回值是否NDIS_STATUS_PENDING,的异步操作
|
|
6楼#
发布于:2004-04-05 14:21
PacketReceivePacket中调用的是ReadFile,NDIS_STATUS_PENDING应该在何处查看
|
|
7楼#
发布于:2004-04-06 12:40
packet的处理方式是在PacketReceiveIndicate()/PacketReceivePacket()函数里处理新收的到的包,看看有没有应用程序因为要收包而pending了,有就满足这个应用程序,没有就放弃这个包,所以你的应用程序当然被满足一把后,再次要求数据前,packet已经丢了很多包。在adapter设备对象扩展内开个缓冲区,不清楚其他人是怎么实现不丢包的。
|
|
|
8楼#
发布于:2004-04-06 16:17
我做的只是抓包,然后显示出来就行了
“在adapter设备对象扩展内开个缓冲区”应该怎么做? |
|
9楼#
发布于:2004-04-06 16:28
创建一个设备,XPDDK的PASSTHRU有相关的代码可以参考。
|
|
10楼#
发布于:2004-04-07 14:52
也许我说的不是很清楚,我将那部分的代码贴出来,麻烦你帮我看看
void CDialog2::OnStart() { // TODO: Add your control notification handler code here CString str ; if( 0 == m_ThreadID ) { str.LoadString( ID_STOP ) ; m_start.SetWindowText( str ) ; } else { if( m_ThreadID ) { PostThreadMessage(m_ThreadID,WM_CLOSE,0,0) ; str.LoadString( ID_START ) ; m_start.SetWindowText( str ) ; m_start.EnableWindow(TRUE) ; } return ; } Filter = Filters[m_Filter.GetCurSel()]; if(Filter !=4){ if(((CTest4App *)AfxGetApp())->packet32.Adapter.OpenInstance != NULL){ BOOL flag = ((CTest4App *)AfxGetApp())->packet32.PacketSetFilter( (LPADAPTER)((CTest4App *)AfxGetApp())->packet32.Adapter.OpenInstance, Filter ); if(flag) { AfxBeginThread(ThreadFunc, (LPVOID)this); } else{ ::MessageBox(NULL, TEXT("Set Filter Failed"), TEXT("Error!"), MB_OK); } } else{ ::MessageBox(NULL, TEXT("Device not open"), TEXT("Error!"), MB_OK); return; } } else{ ::MessageBox(NULL, TEXT("Set Filter First!"), TEXT("Error!"), MB_OK); } } 线程代码如下; UINT ThreadFunc(LPVOID pParam) { CDialog2 *pDlg = static_cast<CDialog2 *>(pParam) ; char *bufwork = NULL; MSG msg ; // int iRet ; // DWORD dwErr ; char *pSource , *pDest ; IPHEADER *pIpHeader ; in_addr ina ; char szSource [16] , szDest[16] /*, szErr [ 50 ]*/; char *pLastBuf = NULL ; int HdrLen, totallen; WORD sourport, destport; CString str, strProto, strSourPort, strDestPort, strData, strSize; struct EtherPacketHead *pEtherHead; // struct IPPacketHead *pIPHead; struct TCPPacketHead *pTCPHead; struct ARPPacket *pARPHead; struct ICMPPacketHead *pICMPHead; struct UDPPacketHead *pUDPHead; BYTE *pdata = NULL; LPPACKET Packet; PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE); pDlg->m_ThreadID = GetCurrentThreadId(); while(TRUE) { Packet=((CTest4App *)AfxGetApp())->packet32.PacketAllocatePacket(/*((CTest4App *)AfxGetApp())->packet32.Adapter.OpenInstance*/); if (Packet != NULL) { ((CTest4App *)AfxGetApp())->packet32.PacketInitPacket( Packet, ((CTest4App *)AfxGetApp())->packet32.Adapter.lpMem, 1514 ); if(!((CTest4App *)AfxGetApp())->packet32.PacketReceivePacket( (LPADAPTER)((CTest4App *)AfxGetApp())->packet32.Adapter.OpenInstance, Packet, TRUE, &((CTest4App *)AfxGetApp())->packet32.Adapter.PacketLength )) { ::MessageBox(0, TEXT("Read Failed"), TEXT("Error!"), MB_OK); } } if(Packet->Buffer) { bufwork = (char *)Packet->Buffer; pEtherHead = (struct EtherPacketHead *)bufwork; strProto = GetProtoName(pEtherHead->ServType); switch(ntohs(pEtherHead->ServType)) { case ETHER_PROTO_IP: { pIpHeader = (IPHEADER *)(bufwork + ETHER_HEAD_LEN); strProto = GetProtoName(pIpHeader->proto); HdrLen = pIpHeader->header_len&0xf; HdrLen *= 4; totallen = ntohs(pIpHeader->total_len); totallen-=HdrLen; ina.S_un.S_addr = pIpHeader->sourceIP ; pSource = inet_ntoa( ina ) ; strcpy( szSource , pSource ) ; ina.S_un.S_addr = pIpHeader->destIP ; pDest = inet_ntoa( ina ) ; strcpy( szDest , pDest ) ; switch(pIpHeader->proto) { case IPPROTO_ICMP: { pICMPHead=(struct ICMPPacketHead *)(bufwork+HdrLen+ETHER_HEAD_LEN); //strL4.Format(" type:%d code:%d\n",pICMPHead->Type,pICMPHead->Code); strSourPort = "-"; strDestPort = "-"; pdata=((BYTE *)pICMPHead)+ICMP_HEAD_LEN; totallen -= ICMP_HEAD_LEN; break; } case IPPROTO_TCP: { pTCPHead=(struct TCPPacketHead *)(bufwork+HdrLen+ETHER_HEAD_LEN); sourport = ntohs(pTCPHead->SourPort); destport = ntohs(pTCPHead->DestPort); //strL4.Format(" sour port:%d,dest port:%d",sourport,destport); strSourPort.Format("%d",sourport); strDestPort.Format("%d",destport); HdrLen = (pTCPHead->HLen)>>4; //in fact only 4 bits HdrLen *= 4; pdata=((BYTE *)pTCPHead)+HdrLen; totallen -= HdrLen; break; } case IPPROTO_UDP: { pUDPHead=(struct UDPPacketHead *)(bufwork+HdrLen+ETHER_HEAD_LEN); sourport = ntohs(pUDPHead->SourPort); destport = ntohs(pUDPHead->DestPort); //strL4.Format(" sour port:%d,dest port:%d",sourport,destport); strSourPort.Format("%d",sourport); strDestPort.Format("%d",destport); pdata=((BYTE *)pUDPHead)+UDP_HEAD_LEN; totallen -= UDP_HEAD_LEN; break; } } if(pIpHeader->proto == IPPROTO_ICMP) strData.Format("type:%d code:%d data:%s",pICMPHead->Type,pICMPHead->Code,pdata); else strData.Format(" %0X",pdata); strSize.Format("%d",totallen); //str = strIP+strL4+strData; pDlg->AddData(strProto,szSource,strSourPort,szDest,strDestPort,strSize,strData); break; } case ETHER_PROTO_ARP: { pARPHead=(struct ARPPacket*)(bufwork+ETHER_HEAD_LEN); pDlg->AddData(strProto,szSource,"0",szDest,"0",strSize,strData); break; } } } ((CTest4App *)AfxGetApp())->packet32.PacketFreePacket(Packet); } return TRUE; } |
|