edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1594回复:16

mikeluo 请进,有问题求教……

楼主#
更多 发布于:2002-12-10 10:10
记得你曾经说过:为了防止丢包,你在发送时是直接处理过才发送的,而接收时时把包缓冲起来再进行处理,我想问的是你缓冲包时是怎么做的,后来又是在什么时机进行处理的?谢谢!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-10 10:28
在receive里面把收到的包插入队列,然后你可以用一个定时器函数去处理这个队列,也可以在receivecomplete里面来处理这个队列,都可以
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-10 14:37
想明白了么?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-10 14:40
呵呵,还没看完呢,我在分块看,等有了心得再告诉你:)
nicol
驱动大牛
驱动大牛
  • 注册日期2001-11-28
  • 最后登录2009-07-30
  • 粉丝0
  • 关注0
  • 积分45分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-10 15:02
在receive里面把收到的包插入队列,然后你可以用一个定时器函数去处理这个队列,也可以在receivecomplete里面来处理这个队列,都可以

效率怎么样?
这个问题以前也考虑过,也尝试过收到后用队列的形式来处理,但效率不高,
后来直接采用直接发送的方式,就是收到后直接处理然后发送,不插队列。
==寂寞骆驼==
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-10 15:07
[quote]在receive里面把收到的包插入队列,然后你可以用一个定时器函数去处理这个队列,也可以在receivecomplete里面来处理这个队列,都可以

效率怎么样?
这个问题以前也考虑过,也尝试过收到后用队列的形式来处理,但效率不高,
后来直接采用直接发送的方式,就是收到后直接处理然后发送,不插队列。
 [/quote]

你的这个方式效率怎么样?用一个对列的话不会有什么影响的,因为经常是队列里面只有几个包,我直接在recive里面调用我的receivecomplete来处理包和当系统调用receivecomplete时在处理的速度没有太大的差别。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
nicol
驱动大牛
驱动大牛
  • 注册日期2001-11-28
  • 最后登录2009-07-30
  • 粉丝0
  • 关注0
  • 积分45分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-10 15:15

你的这个方式效率怎么样?用一个对列的话不会有什么影响的,因为经常是队列里面只有几个包,我直接在recive里面调用我的receivecomplete来处理包和当系统调用receivecomplete时在处理的速度没有太大的差别。

这个方式的效率不错
当时我用的是两个网卡,就是A收到包,处理,转发到B。开始的时候,用的是队列,A收到包,插到对列,处理队列中的包,转发到B。流量小的时候效率看不错差别,流量一大,就完,只有平常直接连接的1/4。
开始也没找到原因,后来干脆把队列砍了,直接处理转发,然后测,和直接连接的速度差别不大了。
==寂寞骆驼==
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-10 15:20
你是不是用了一个定时器函数处理的队列?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-12-10 15:22
我也发现用一个定时器函数处理的时候当用SMB读取文件的时候就慢的无法忍受
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
nicol
驱动大牛
驱动大牛
  • 注册日期2001-11-28
  • 最后登录2009-07-30
  • 粉丝0
  • 关注0
  • 积分45分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-10 15:23
你是不是用了一个定时器函数处理的队列?

是啊,设一个定时器来处理队列。。。其实我的看法是队列可能效率影响不大,主要的问题是出在定时器上,在我的印象中,定时器的精确度不够。
==寂寞骆驼==
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-12-10 15:29
[quote]你是不是用了一个定时器函数处理的队列?

是啊,设一个定时器来处理队列。。。其实我的看法是队列可能效率影响不大,主要的问题是出在定时器上,在我的印象中,定时器的精确度不够。 [/quote]

是的,那个定时器是有问题,我用他处理也巨慢无比,不过对于FTP TCP UDP都可以,就是SMB的时候慢,让你无法忍受
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
nicol
驱动大牛
驱动大牛
  • 注册日期2001-11-28
  • 最后登录2009-07-30
  • 粉丝0
  • 关注0
  • 积分45分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-12-10 15:34

是的,那个定时器是有问题,我用他处理也巨慢无比,不过对于FTP TCP UDP都可以,就是SMB的时候慢,让你无法忍受

后来想一个主意,就是在每次接收完了,就发送一个事件信号给队列处理线程,但后来发先不要队列处理的挺快,就没去尝试这个方案。
你们要是尝试了,告诉我结果吧。

最早想到用队列是担心接收后,处理延迟,不能很快返回包的所有权,而丢失包。后来胡大侠说不用担心,NDIS本身是异步的,已经考虑了这个问题,所以只要专心做好处理例程就行。
HOHO。
==寂寞骆驼==
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-12-10 15:39
当一个receive被重入的时候这时候两个receive是相当于两个线程还是什么状态?我没有搞清楚这个问题,所以还是用的队列,在receivecomplete里面处理这个队列
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
nicol
驱动大牛
驱动大牛
  • 注册日期2001-11-28
  • 最后登录2009-07-30
  • 粉丝0
  • 关注0
  • 积分45分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-12-10 15:41
当一个receive被重入的时候这时候两个receive是相当于两个线程还是什么状态?我没有搞清楚这个问题,所以还是用的队列,在receivecomplete里面处理这个队列

被重入??没明白你的意思。如果我没返回所有权。NDIS会重入吗?应该不会吧。
==寂寞骆驼==
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-12-10 15:44
 
NDIS本身是异步的


所以会被重入的吖,
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
nicol
驱动大牛
驱动大牛
  • 注册日期2001-11-28
  • 最后登录2009-07-30
  • 粉丝0
  • 关注0
  • 积分45分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-12-10 15:47
[quote] NDIS本身是异步的


所以会被重入的吖, [/quote]呵呵,对。
误会你的意思了,我以为你要重入同一个包呢。吓我。
我的估计是:NDIS在重入Receive的时候,就是把函数扔到系统进程去排队了。所以不会有什么问题。
==寂寞骆驼==
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-12-11 15:10
多谢两位大侠高论,我有收获,现在决定立即处理了。

即省事又省时,何乐而不为?!

给分!
游客

返回顶部