Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6623653
  • 博文数量: 227
  • 博客积分: 10047
  • 博客等级: 上将
  • 技术积分: 6678
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-11 10:33
个人简介

网上的蜘蛛

文章分类

全部博文(227)

文章存档

2010年(19)

2009年(29)

2008年(179)

分类: 系统运维

2008-05-12 17:24:25

关于VirtualWiFi,我就不想再多说了,一个虚拟化的网络技术。可以实现单张网卡同时多个网络连接。如下图:
其实呢,根据IEEE802.11协议,一种wifi网卡只能连接或者关联一个网络。所谓的虚拟化的技术也不能违背这个协议,所以它的实现方法是高速的再多个网络切换,就像CPU调度一样为每一个thread分配服务时间,VirtualWiFi就是这个工作原理。所以上图显示的connection1是激活状态的(active),connnection2就是未激活(passive).只有active的网络才能发送和接受数据,如果passive的网络比如connection2想发送数据,哪么它的数据就会被缓冲起来直到下个时间段,conneciton2被激活(activeated)才能发送缓冲期的数据。本章简单介绍VirtualWiFi中数据在缓冲区是如何组织的。其实不是很难的数据结构,至少一个link queue.先来看看这个link queue的结构定义:
 

typedef struct _QUEUE_ENTRY
{
    struct _QUEUE_ENTRY *Next;
} QUEUE_ENTRY, *PQUEUE_ENTRY;

typedef struct _QUEUE_HEADER
{
    PQUEUE_ENTRY Head;
    PQUEUE_ENTRY Tail;
} QUEUE_HEADER, *PQUEUE_HEADER;

这个link queue有一个Queue_Header.它包含head,tail两个指针,分别指向头尾。link queue里面的还有一个next指针指向下个entry.所以在结构初始化的时候,head和tail两个指针都赋值为NULL.

#define InitializeQueueHeader(QueueHeader) \
    { \
        (QueueHeader)->Head = (QueueHeader)->Tail = NULL; \
    }

所以插入动作也很简单,看源码:

#define InsertTailQueue(QueueHeader, QueueEntry) \
    { \
        ((PQUEUE_ENTRY)QueueEntry)->Next = NULL; \
        if ((QueueHeader)->Tail) \
            (QueueHeader)->Tail->Next = (PQUEUE_ENTRY)(QueueEntry); \
        else \
            (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry); \
        (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry); \
    }

用结构图来显示工作原理最适合不过了;

那么同样,当connection2激活的时候,需要发送缓冲期的数据的时候,是从entry1开始逐个发送的。源代码:

#define RemoveHeadQueue(QueueHeader) \
    (QueueHeader)->Head; \
    { \
        PQUEUE_ENTRY pNext; \
        ASSERT((QueueHeader)->Head); \
        pNext = (QueueHeader)->Head->Next; \
        (QueueHeader)->Head = pNext; \
        if (pNext == NULL) \
            (QueueHeader)->Tail = NULL; \
    }

用图表来表示更为清楚了然:

很简单吧。不过数据结构对整个程序的开发很重要。而毕业设计所涉及的也就是这些数据的处理。好了,数据处理就先到这里。

-----------------------------------
阅读(2020) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~