阅读:1458回复:3
!!!!求大侠帮助!怎么让程序只走PtReceivePacket而不走PtReceive??
因为8139返回空的原因,我换了DLINK 530的网卡,程序刚开始是走PtReceivePacket过了一会就走PtReceive了,不知道为何原因?
还有怎么让程序只走PtReceivePacket,我在PtRegisterAsProtocol里,把//ProtocolStruct.ReceiveHandler = PtReceive;去掉了这样行吗? 肯求大侠帮助!!!!! |
|
最新喜欢:![]() |
沙发#
发布于:2005-01-13 16:48
首先应该弄清楚你的网卡是否支持一次接受多个数据包。如果支持,那么应该走PtReceivePacket,否则走PtReceive。如果网卡不支持一次接受多个数据包,NDIS不会调用PtReceivePacket
|
|
板凳#
发布于:2005-01-14 00:43
首先应该弄清楚你的网卡是否支持一次接受多个数据包。如果支持,那么应该走PtReceivePacket,否则走PtReceive。如果网卡不支持一次接受多个数据包,NDIS不会调用PtReceivePacket 就是DLINK 530的网卡,一会走一会不走,郁闷中............. |
|
地板#
发布于:2005-01-26 15:08
程序走哪个历程,不是你能控制的。
一般来说,这取决于中间层之下的驱动(一般是网卡微端口驱动)向中间层提交数据时,采用的通告方式。 如果中间层同时提供了PtReceivePacket和PtReceive这两个收包处理例程,这时候: 1.如果下层(比如网卡驱动)使用系统调用NdisMIndicateReceivePacket(),向上层(本处意思就是中间层)通告一个完整的数据包到达时,上层(中间层)将调用PtReceivePacket例程来处理下层提交的一个完整的数据包。 2.如果下层(比如网卡驱动)使用介质相关的系统调用NdisMXXXIndicateReceive(),向上层提交数据包的部分数据(这些部分数据一般是头部)时,上层(中间层)将调用PtReceive例程来处理下层提交的数据包的头部,以确定是否继续接受这个数据包的剩余部分。 实际上,PtReceive例程也能处理一个完整的数据包。对于中间层来说,PtReceive例程是必须提供的,PtReceivePacket例程不是必须的。走哪个路线,取决于底层驱动向上层通告的方式。 就我个人的经验而言,realTK的网卡(驱动),一般走PtReceive例程,而且采用异步方式,使用NdisMXXXIndicateReceive()向上层通告,只提交部分数据,如果决定继续接受,再由上层来调用NdisTransferData()来获取数据包的剩余部分。 D-LinK得网卡和Intel的网卡(驱动),一般一次是把一个数据包封装好了再上向层使用NdisMIndicateReceivePacket()通告,上层(中间层)如果提供了PtReceivePacket例程,则使用这个PtReceivePacket例程来处理。如果没有提供PtReceivePacket例程,则交给PtReceive例程处理。 这就是我的理解和总结,欢迎大虾们指正。如果回答得好,搂住请给分。 |
|