阅读:1431回复:5
请教PASSTHRU里MPSend函数的问题
各位大虾:
请看: PASSTHRU里MPSend函数里有如下代码 NdisSend(&Status, pAdapt->BindingHandle, MyPacket); if (Status != NDIS_STATUS_PENDING) { NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); NdisFreePacket(MyPacket); } } else { // // We are out of packets. Silently drop it. Alternatively we can deal with it: // - By keeping separate send and receive pools // - Dynamically allocate more pools as needed and free them when not needed // } 我想请问: 1。当 NdisSend(&Status, pAdapt->BindingHandle, MyPacket); 函数返回的Status值为 NDIS_STATUS_PENDING时NdisFreePacket(MyPacket)没有执行,那前面NdisAllocatePacket(&Status, &MyPacket, pAdapt->SendPacketPoolHandle)函数声明的MyPacket的资源岂不是没有被释放,这样一来程序为什么不会出错? 2。当我不想让驱动向下发送数据包时,我将前面的NdisSend语句注释掉,结果运行后是不能发包了,但是又发现收包也不行了,这是怎么回事,如果我只想单纯的禁止发包而不影响收包应该如何修改呢? 希望能得到高手的指点,我是一只饥渴的菜鸟:( |
|
沙发#
发布于:2003-04-24 11:21
探讨:
是不是说pending 状态时候,还没有发送完成,等完成之后在释放packet 资源呢?? |
|
板凳#
发布于:2003-04-24 11:31
呵呵,我也是新手,不过刚好刚刚做过这方面的东西
1。返回pending的时候,说明低层暂时对这个包缓存且不做处理,当低层有空,做完对这个包的处理时,会调用PtSendComplete来返回处理状态和控制权,这时候在这个函数里面释放,还可以看到发包的状态。 2。个人觉得是没有道理的,收发包至少在passthru向下的结构中应该是互不干涉吧,不知道你是怎么判断收包也不行的? |
|
地板#
发布于:2003-04-24 16:25
在SendComplete中释放啊 :)
|
|
|
地下室#
发布于:2003-04-24 22:46
第一个问题上面已经说的很清楚了。
对于第二个问题。我认为既然你已经禁止发包,那么其他的机器就不能收到你的任何信息包括你的MAC,因此除了广播包你可以收到以外,别的包里肯定没有你的MAC。 我曾经禁止过本机的ARP包,现象是我PING另外一台机器永远不通(前提是ARP表没有那台机器的MAC),然后我开FTP服务器,那个机器也不能登陆。 |
|
5楼#
发布于:2003-04-25 15:07
呵呵,关于不能收到包得问题,确实是这样得,因为你不发任何包,没有人会知道你得存在,就算对方主动ping你,你得reply也发不过去,你ping别人,ping包出不去,因此你在应用层得感觉肯定就是收不到包了,其实是可以收到得,比如你在receive函数里面做一个输出,把所有收到得包显示出来看,就会发现其实是可以收到包得
|
|