关于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) |