阅读:3146回复:17
Ndis的Passthru例子中收不到Packet
有谁碰到过这种问题: Ndis的Passthru例子程序中,为什么在我得网络中Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext)语句中Packet得到NULL,可是我查看了其中的两个参数都不为NULL,还可以用什么方法实现收包(receive packets),
用transferData吗?而在另外一个局域网中则可正常收包。 [blue 编辑于 2001-04-26 20:00] |
|
沙发#
发布于:2001-04-27 17:23
我相信问题不在NdisGetReceivedPacket这个函数
而是在绑定时 MPInitialize 或者 PtBindAdapter 工作不稳定, 这样就不能接收数据包, |
|
|
板凳#
发布于:2001-05-07 20:11
Thanks!
我已经将PtBindAdapt()中全部检查了一遍,没有出错的.我认为不是此处的问题,但我也不知究竟错在哪里 再次感谢你gfsoft! |
|
地板#
发布于:2001-05-08 08:59
可能你的网卡型号不一样,因为它们的工作方式不一样,所以它们收包时所调用的函数不一样,而你好象只作了一种情况。
|
|
|
地下室#
发布于:2001-05-09 13:12
我的网卡是Realtek RTL8139(A) Fast Ethernet Adapter(PCI),我还试过3COM的3C509b(ISA),也不行。那么收包时,对于其它网卡的工作方式还可调用哪些函数,如何处理?
另外,我查过资料,microsoft在ReceivePacketHanle可能有Bug [附:BUG摘要:)] 如果miniport 或 NDIS IM driver 使用NdisMIndicateReceivePacket 函数来指示接收, 当虚拟内存描述为跨越多个NDIS_BUFFERs (MDLs)的时,ReceivePacketHandler 就不处理这件事了。 If a miniport or NDIS IM driver uses the old NdisMEthIndicateReceive function rather than NdisMIndicateReceivePacket, then multiple NDIS_BUFFERs (MDLs) in receive works fine as buffer chain is converted to a flat buffer. As far as known, this bug is present in Windows 2000 through at least SP1 as well as Whistler. This bug may actually never be fixed and may, instead, become part of the specification. 这样当Packet的构造不能容纳这个BUG时,TCP/IP ReceivePacketHandler 就忽略这个Packet |
|
5楼#
发布于:2001-05-09 13:48
1。你的PACKET结构所指向的BUFFERS们长度是否够用?
2。是所有包收不到还是一部分 3。两个网络是否有区别,是不是有交换机? |
|
|
6楼#
发布于:2001-05-10 10:15
我查看了PtReceive(..),从HeaderBuffer开始就是帧的数据,当PacketSize较小时,PacketSize==LookaHeadBufferSize,此时据说需重新打包,but how will I packeted the data;当PacketSize较大时,PacketSize >LookaHeadBufferSize,需使用 NdisTransferData function 补充剩余的the packet,具体怎样作?
谁能告诉我?那我对他的敬仰有如滔滔江水--连绵不绝....:P |
|
7楼#
发布于:2001-05-11 11:44
我将网卡由RealTek RTL8139(A) 换成D-Link DFE530TX,总算收到了,只是问题依旧没有解决,算了,不管了。
而且,Dlink网卡不Call ReceiveHandler (即 PtReceive),而是调用ReceivePacketHandler (即 PtReceivePacket),不明白? 哪位高手能解释调用的机理! |
|
8楼#
发布于:2001-05-11 15:47
这是因为2者的硬件结构不一样,一个是使用端口,一个是SHARE MEMORY
|
|
|
9楼#
发布于:2001-05-28 13:26
这么多回答还是没有彻底解决问题。
我也收不到的,现象和blue的一模一样。我的网卡是Realtek RTL8029(AS),总不会我也要换网卡吧。问题到底出在哪呢? |
|
|
10楼#
发布于:2001-05-28 13:32
你用调试工具跟踪一下就知道该修改哪一个例程了。
当然你要是要作一个产品的话就得消化DDK的那一部分,不然作出的东西就没有通用性。 |
|
|
11楼#
发布于:2002-04-21 22:00
我也遇到同样的问题,希望大家给个说法。
//bow |
|
12楼#
发布于:2002-04-22 00:13
我在网上曾经看到过说微软的PACKET例子有BUGS的!但是具体的地址我网了
|
|
13楼#
发布于:2002-04-28 19:23
我在我的机器上(10/100M自适应网卡)跟踪,其实大部分是以下两种情况:
1.调用PtReceive,并且LookAheadBufferSize == PacketSize; 2.调用PtReceive,并且LookAheadBufferSize < PacketSize。 虽然微软的文档里声称使用ReceivePacket会有性能上的改善,但是实际当中几乎从来没有调用PtReceivePacket,而且在PtReceive中调用NdisGetReceivedPacket时从来都是返回NULL,所以,似乎下层的驱动总是使用NdisMEXxxIndicateReceive来指示IM接收数据包,而从来不调用NdisMIndicateRecievePacket来进行包接收指示。所以,IM的PtReceivePacket也就从来不被调用(Optional)。 当LookAheadBufferSize == PacketSize时,重新打包其实是比较容易的;而当LookAheadBufferSize < PacketSize时,需要调用NdisTransferData,会比较麻烦一点。当LookAheadBufferSize == PacketSize时,可以如下打包(在PtReceive中,这是参考XP DDK里面ndisuio、passthru等例子的,大家去看看XP DDK里面的例子吧,我觉得XP DDK的例子要好一些): PNDIS_PACKET MyPacket; PNDIS_BUFFER OriginalBuffer; PUCHAR DataContent; UINT PacketLength; PacketLength = HeaderBufferSize + PacketSize; NdisAllocateMemoryWithTag(&DataContent, PacketLength, TAG); if(DataContent != NULL) { NdisAllocateBuffer(&Status, &OriginalBuffer, pAdapt->RecvBufferPoolHandle, DataContent, PacketLength); if(Status == NDIS_STATUS_SUCCESS) { NdisMoveMappedMemory(DataContent, HeaderBuffer, HeaderBufferSize); NdisAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle); if(Status == NDIS_STATUS_SUCCESS) { if(LookAheadBufferSize == PacketSize) { NdisMoveMappedMemory(DataContent + HeaderBufferSize, LookAheadBuffer, PacketSize); NdisChainBufferAtFront(MyPacket, OriginalBuffer); } } } } 经过上面的处理,MyPacket里面已经含有了整个包的数据,此时可以调用NdisMIndicateReceivePacket指示上面的协议驱动程序接收(NDIS将调用上面协议驱动的PtReceivePacket);别忘了需要在适当的时候释放资源(大部分情况下可以在MPReturn中释放分配的资源); 如果PacketSize > LookAheadBufferSize,需要自己调用NdisTransferData,并且在PtTransferDataComplete中进行相应的处理,可以在那里整合成一个包,并且调用NdisMIndicateReceivePacket指示。 在passthru的例子中,这两步都没有做,而只是直接地使用NdisMXxxIndicateReceive进行了简单处理。 [编辑 - 4/28/02 作者: falwind] |
|
14楼#
发布于:2002-04-28 21:16
怎么跟踪
|
|
|
15楼#
发布于:2003-07-28 21:30
请问怎么调试自己修改过的passthru?
|
|
16楼#
发布于:2004-01-12 10:58
NdisTransferData 虽然能够得到所有的数据,但是不能处理数据
|
|
17楼#
发布于:2004-01-12 13:14
把数据考出来,处理后再通知上层,传送你处理过的数据
|
|
|