阅读:1467回复:2
一个现象很奇怪,与大家讨论讨论
我编写了一个NDIS驱动(Windows2000下),与PC机上的一块PCI卡通信,模拟了一个网络通道。现在通过这个通道,Ping很顺利。但在FTP或其他SOCKET连接时,会出现某种阻塞现象。用Sniffer捕捉了一下FTP时的包(FTP Server在PC机上),发现在打开FTP连接时,TCP的三次握手很顺利,但握手完后,FTP Server却没有立即收到连接请求;在过了一段时间后(这段时间的长短不定,可以长达若干分钟),FTP Server才收到连接请求,这时登录的交互通信很快。在这种阻塞情况下,如果在PC机上Ping一下localhost,则阻塞立刻被解除。但如果阻塞时去Ping PCI卡,则能够Ping通,但FTP仍处于阻塞状态。
根据这种现象,估计阻塞是发生在系统的TCP/IP栈上。但详细的原因,我一直没有找到,因为Windows的TCP/IP栈是个黑盒子。 由于对应的PCI卡上驱动的不完善,在这个通道上,有些服务不支持,比如ARP。所以也有可能是因为Windows在这个网络通道上有些信息没有获得,才产生了阻塞。如果PC机上运行的是Linux,那么一切通信就都正常了。 还有个可能就是Windows上的网络配置或相关的注册表项不正确。 不知各位高手有何见解? |
|
最新喜欢:zackar... |
沙发#
发布于:2002-05-29 17:42
你是怎么实现的?是不是造了一个Nic driver, 然后抓到这发送到这个网卡的包,通过pci通道把爆发送出去?我觉得奇怪,既然其他的包能发送出去,为什么不能实现ARP,你的驱动写在哪一层?
|
|
板凳#
发布于:2002-05-31 17:52
这个问题现在已经解决了。
我以前在驱动中是用NdisMEthIndicateReceive()向上层传包,现在我改成了用NdisMIndicateReceivePacket(),结果故障就消失了。 但我现在还不清楚这种现象的根本原因,不知是NDIS库的问题,还是我对NdisMEthIndicateReceive()的使用不对。 至于ARP,是因为PCI卡上Linux系统的驱动是合作方写的,对方声称不能实现ARP,我想是因为他们不想去做。 |
|