wangjianfeng
驱动小牛
驱动小牛
  • 注册日期2004-05-28
  • 最后登录2013-10-02
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望263点
  • 贡献值0点
  • 好评度260点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2005-02-19 17:00
关注!我也有个类似程序,想请教大家.
wfine
驱动牛犊
驱动牛犊
  • 注册日期2004-08-15
  • 最后登录2005-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2005-02-24 20:55
我开辟了个共享队列由应用和驱动来共同维护此队列
1.开辟个共享队列由驱动和应用共同维护
2.收发包时把数据包保存在队列中不发送但告诉protocol/nic收发成功,同时通知上层有数据包到来要处理。
3.应用收到数据包通知后读取、分析数据然后决定该报是否阻断(通过对共享数据中的某个节点的某个Flag做标记).....
4.在驱动中也建立线程监控共享队列中的数据是否在应用中做了标记(有效、已读、已处理等)然后来决定是否发送
5.我测试过ping 65500的数据包的时候系统处理不会造成丢包
.这样可以由应用程序来决定某个包能否通过。

我开始发此初帖的时候(想每来一个包然后由上面决定然后通知线面是否通过)没有考虑到网卡收发包的速度比事件通知快,走了很多弯路(第一次搞驱动,高手们多帮助我)。


[编辑 -  7/19/04 by  chili]
wfine
驱动牛犊
驱动牛犊
  • 注册日期2004-08-15
  • 最后登录2005-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2005-02-25 08:16
请问4怎么实现?
在驱动中怎么实现多线程?
baoyibao99
禁止发言
禁止发言
  • 注册日期2003-05-07
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分894分
  • 威望8415点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2005-03-02 11:54
用户被禁言,该主题自动屏蔽!
wfine
驱动牛犊
驱动牛犊
  • 注册日期2004-08-15
  • 最后登录2005-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2005-03-24 20:26
我按照chili的方法做了,但是没有解决丢包的问题,主要是同步和队列的大小没设置好,请大家帮忙。
  这地方我设置pRevQueue大小为9500,大概能接受6个包(1514),pRevQueue我用的是一个非分页内存,为了防止分页问题,这地方我不敢设得比较大,请问这地方设多大最好呀,还有就是这地方必须要采用非分页内存吗?

    一个接受包的队列:pRevQueue;
    每个节点:包的内容+flag  flag=0 未处理,flag=1 已处理
    这个队列我通过一个pRevEvent来控制同步的


在驱动层:
网卡上传来一个包packet;
pNode=CreatNode(packet);//根据packet建立一个queue node 其中flag=0
EnQueue(pRevQueue,pNode);//pNode进入队列(在pNode进入队列时,先对flag=1的Node作删除操作
KeSetEvent(pRevEvent, 0, FALSE);//这地方我采用事件通知上层,请问这用这个方法好吗?还有没有其它的方法?





在应用层:
while(repeat)
{
WaitForSingleObject(mpRevEvent,INFINITE);//mpRevEvent与pRevEvent相关联
while(IsNotEmpty(mpRevQueue))
{
ModifyQueue(mpRevQueue,pNode);//取出flag=0的node,并且将其flag设为1
//对pNode进行处理
}
ResetEvent(mpRevEvent);

}

[编辑 -  3/24/05 by  wfine]
上一页 下一页
游客

返回顶部