win下的802.1x客户端alpha版发布

版权:
本软件依照 GPLv2发布。

Copyright (C) 2006 Charming Sun \me@sunchangming.com\

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

额外加上一条,禁止与中国电信有业务往来的任何商业公司使用本软件的源代码。我保留起诉的权利。
使用说明:
本软件尚属于Alpha内测版,BUG较多。
如果您使用中遇到了任何问题,请以邮件的方式联系我: me@sunchangming.com
1、如果更改了任何设置,建议重新应用程序以让它生效。
2、无论是点连接还是断开,无论是成功还是失败。你从界面上都无法得到任何回复的。(因为我还没有开发完)。
如果连接成功,你的IP会变的,此时你上网,如果成功,就成功了。
否则,打开帮助-〉NIC设备信息,先点释放IP,然后点重新分配IP。
如果离线成功,IP是会被自动释放的。请检查你的IP是不是变成0.0.0.0,就知道你的IP是不是离线成功了。
3、分配IP前必须要释放现在的IP,否则多数会失败。
开发说明:
本软件的代码目前由Changming Sun独自开发,但是没有大勇同学的协助我是完全无法完成这项工作的。我写这些代码的主要意图是为了学习802.1x协议的原理和实现。
但是我毕竟已经大四了,把代码放出来的目的是希望有更多的人参与进来,等我毕业后能有人接着维护下去。
可移植性:
本软件支持的平台主要是FreeBSD和Windows XP(2000)。
在FreeBSD下采用的是bpf做抓包、发包器,很易于移植到其它BSD衍生平台上,例如NetBSD、OpenBSD、Mac OS
X等。但是BSD版没有做图形界面。加入了gettext支持。但是目前支持的语言只有简体中文和英文。(缺乏翻译)
整个程序使用单线程的方式运行。
Win32版是在BSD版的基础上重写的。
采用winpcap3.1做抓包、发包器。
采用wxWidget做GUI,整个程序使用多线程(>2)的方式运行。绝大部分代码花在了线程同步上。
我的线程的设计思路是这样的:
程序启动后分为两个线程。(之所以是两个是因为现在双核和HTT的CPU很普遍,这样可以获得很好的性能)
一个是前台的GUI线程,一个是后台的主控制线程。实际执行的时候还有其它的worker thread。
前台的GUI线程,只负责接受用户输入,实际上不执行任何操作。
GUI线程有一个 AgentProxy 类型的对象。提供了connect和logout等函数。GUI执行这些函数。
AgentProxy里面的函数负责做两件事情。
1、把参数binding到函数对象。
2、延迟函数的真正执行。把函数对象插入到主控制线程的消息队列里面。
后台的主控制线程(Scheduler类),对所有任务按优先级进行调度。主线程支持协作式取消。即,对其发出cacel指令后,它能在1秒内响应此请求并清理资源并退出。
它在一开始首先打开一个NIC device,获得一个句柄。然后进入消息循环。
Scheduler 类有一个类型为 ActivationQueue
的成员。ActivationQueue负责从消息队列里面读取字符串,然后反序列化为 MethodRequest
对象。Scheduler并不知道 MethodRequest 实际是什么。它只负责新建一个线程执行该操作。
对象的序列化和反序列化采用的是XML的方式,目前遇到的主要困难是指针难以被序列化,而Future这样的对象难以被序列化。
整个程序架构上最混乱的地方在于不同请求之间的数据传递。例如,connect请求可以获得server的mac地址。而这个地址logout请求需要。
再比如,connect请求和logout请求要共享NIC device的handle。
还有一点就是worker线程的执行状态不能及时的显示在GUI上。
GUI上main frame的body部分我分为两栏,右面这个本来是用来以滚动方式显示日志的。理论上来讲,以std::ostream方式创建的流(包括stdout,stdin,stderr)都可以重定向到这里来。但是现在的主要问题有两个:
1。整个程序的GUI部分的内部编码采用的是Unicode,而ostream是窄字符集,采用的是ANSI编码,于是显示的时候就出现了乱码。
2。如果多线程同时向这里写入,很容易发生死锁。原因不明。
网络菜单栏提供了一个发送arp请求的界面,主要是因为,如果目的地IP和源IP相同,然后重复发送,就可以达到抢IP的目的,甚至可以借此伪装网关。但是经我测试,效果不是很理想。原因有待查明。
主线程本来是支持协作式取消的,但是由于不停的循环导致CPU一直处于繁忙状态。(CPU使用率100%)。所以发布的时候去掉这一功能。
配置文件的参数说明:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="3">
<c class_id="0" tracking_level="0" version="0">
<username>21548784548</username>
<password>154584847878</password>
<ifdevName>\Device\NPF_{1B6E0761-1BA2-1234-1234-AF6306D73232}</ifdevName>
<read_timeout>2000</read_timeout>
<snaplen>65536</snaplen>
</c>
</boost_serialization>

username:卡号
password:密码
ifdevName:建议不要手动修改。前面几个字节是"\Device\NPF_",后面是NIC的名字。
read_timeout: 单位:毫秒 pcap的读取数据的超时时限。以微妙为单位。太大会降低效率,特别大的数字将会导致完全收不到数据。
snaplen: 单位: 字节。 每个包最多保存多大的数据,应该小于本地网络的MTU。
二进制文件: (链接已失效)

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥