阅读:1685回复:16
mikeluo 请进,有问题求教……
记得你曾经说过:为了防止丢包,你在发送时是直接处理过才发送的,而接收时时把包缓冲起来再进行处理,我想问的是你缓冲包时是怎么做的,后来又是在什么时机进行处理的?谢谢!
|
|
沙发#
发布于:2002-12-10 10:28
在receive里面把收到的包插入队列,然后你可以用一个定时器函数去处理这个队列,也可以在receivecomplete里面来处理这个队列,都可以
|
|
|
板凳#
发布于:2002-12-10 14:37
想明白了么?
|
|
|
地板#
发布于:2002-12-10 14:40
呵呵,还没看完呢,我在分块看,等有了心得再告诉你:)
|
|
地下室#
发布于:2002-12-10 15:02
在receive里面把收到的包插入队列,然后你可以用一个定时器函数去处理这个队列,也可以在receivecomplete里面来处理这个队列,都可以 效率怎么样? 这个问题以前也考虑过,也尝试过收到后用队列的形式来处理,但效率不高, 后来直接采用直接发送的方式,就是收到后直接处理然后发送,不插队列。 |
|
|
5楼#
发布于:2002-12-10 15:07
[quote]在receive里面把收到的包插入队列,然后你可以用一个定时器函数去处理这个队列,也可以在receivecomplete里面来处理这个队列,都可以 效率怎么样? 这个问题以前也考虑过,也尝试过收到后用队列的形式来处理,但效率不高, 后来直接采用直接发送的方式,就是收到后直接处理然后发送,不插队列。 [/quote] 你的这个方式效率怎么样?用一个对列的话不会有什么影响的,因为经常是队列里面只有几个包,我直接在recive里面调用我的receivecomplete来处理包和当系统调用receivecomplete时在处理的速度没有太大的差别。 |
|
|
6楼#
发布于:2002-12-10 15:15
这个方式的效率不错 当时我用的是两个网卡,就是A收到包,处理,转发到B。开始的时候,用的是队列,A收到包,插到对列,处理队列中的包,转发到B。流量小的时候效率看不错差别,流量一大,就完,只有平常直接连接的1/4。 开始也没找到原因,后来干脆把队列砍了,直接处理转发,然后测,和直接连接的速度差别不大了。 |
|
|
7楼#
发布于:2002-12-10 15:20
你是不是用了一个定时器函数处理的队列?
|
|
|
8楼#
发布于:2002-12-10 15:22
我也发现用一个定时器函数处理的时候当用SMB读取文件的时候就慢的无法忍受
|
|
|
9楼#
发布于:2002-12-10 15:23
你是不是用了一个定时器函数处理的队列? 是啊,设一个定时器来处理队列。。。其实我的看法是队列可能效率影响不大,主要的问题是出在定时器上,在我的印象中,定时器的精确度不够。 |
|
|
10楼#
发布于:2002-12-10 15:29
[quote]你是不是用了一个定时器函数处理的队列? 是啊,设一个定时器来处理队列。。。其实我的看法是队列可能效率影响不大,主要的问题是出在定时器上,在我的印象中,定时器的精确度不够。 [/quote] 是的,那个定时器是有问题,我用他处理也巨慢无比,不过对于FTP TCP UDP都可以,就是SMB的时候慢,让你无法忍受 |
|
|
11楼#
发布于:2002-12-10 15:34
后来想一个主意,就是在每次接收完了,就发送一个事件信号给队列处理线程,但后来发先不要队列处理的挺快,就没去尝试这个方案。 你们要是尝试了,告诉我结果吧。 最早想到用队列是担心接收后,处理延迟,不能很快返回包的所有权,而丢失包。后来胡大侠说不用担心,NDIS本身是异步的,已经考虑了这个问题,所以只要专心做好处理例程就行。 HOHO。 |
|
|
12楼#
发布于:2002-12-10 15:39
当一个receive被重入的时候这时候两个receive是相当于两个线程还是什么状态?我没有搞清楚这个问题,所以还是用的队列,在receivecomplete里面处理这个队列
|
|
|
13楼#
发布于:2002-12-10 15:41
当一个receive被重入的时候这时候两个receive是相当于两个线程还是什么状态?我没有搞清楚这个问题,所以还是用的队列,在receivecomplete里面处理这个队列 被重入??没明白你的意思。如果我没返回所有权。NDIS会重入吗?应该不会吧。 |
|
|
14楼#
发布于:2002-12-10 15:44
NDIS本身是异步的 所以会被重入的吖, |
|
|
15楼#
发布于:2002-12-10 15:47
[quote] NDIS本身是异步的 所以会被重入的吖, [/quote]呵呵,对。 误会你的意思了,我以为你要重入同一个包呢。吓我。 我的估计是:NDIS在重入Receive的时候,就是把函数扔到系统进程去排队了。所以不会有什么问题。 |
|
|
16楼#
发布于:2002-12-11 15:10
多谢两位大侠高论,我有收获,现在决定立即处理了。
即省事又省时,何乐而不为?! 给分! |
|