sweetzhf
驱动牛犊
驱动牛犊
  • 注册日期2005-01-08
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1457回复:3

!!!!求大侠帮助!怎么让程序只走PtReceivePacket而不走PtReceive??

楼主#
更多 发布于:2005-01-13 10:30
因为8139返回空的原因,我换了DLINK 530的网卡,程序刚开始是走PtReceivePacket过了一会就走PtReceive了,不知道为何原因?

还有怎么让程序只走PtReceivePacket,我在PtRegisterAsProtocol里,把//ProtocolStruct.ReceiveHandler = PtReceive;去掉了这样行吗?


肯求大侠帮助!!!!!

最新喜欢:

xiaojian521xiaoji...
shortlight
驱动牛犊
驱动牛犊
  • 注册日期2003-11-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望81点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-13 16:48
首先应该弄清楚你的网卡是否支持一次接受多个数据包。如果支持,那么应该走PtReceivePacket,否则走PtReceive。如果网卡不支持一次接受多个数据包,NDIS不会调用PtReceivePacket
sweetzhf
驱动牛犊
驱动牛犊
  • 注册日期2005-01-08
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-14 00:43
首先应该弄清楚你的网卡是否支持一次接受多个数据包。如果支持,那么应该走PtReceivePacket,否则走PtReceive。如果网卡不支持一次接受多个数据包,NDIS不会调用PtReceivePacket


就是DLINK 530的网卡,一会走一会不走,郁闷中.............
ririri
驱动牛犊
驱动牛犊
  • 注册日期2004-06-02
  • 最后登录2005-07-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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例程处理。

    这就是我的理解和总结,欢迎大虾们指正。如果回答得好,搂住请给分。
游客

返回顶部