0%

1
2
3
4
5
6
# MD5
certutil -hashfile yourfilename.ext MD5
# SHA1
certutil -hashfile yourfilename.ext SHA1
# SHA256
certutil -hashfile yourfilename.ext SHA256

用户态

今天看netfilter的源码,发现一个打印点分十进制的好方法:使用NIPQUAD和NIPQUAD_FMT宏:

1
2
3
4
5
6
7
#define NIPQUAD_FMT "%u.%u.%u.%u"

#define NIPQUAD(addr) \
((unsigned char *)&addr)[0], \
((unsigned char *)&addr)[1], \
((unsigned char *)&addr)[2], \
((unsigned char *)&addr)[3]
阅读全文 »

编译环境

  • Ubuntu 12.04 32bit
  • Windows Subsystem for Linux

项目源码

项目源码托管在GitHub上,地址如下:**openwrt-hc5x61**。

本项目不是官方支持的OpenWRT,因此OpenWRT版本比较旧,有较大的差别。

本项目使用的是极路由的极路由2路由器。

前提工作

  1. 必装工具(仅限Debian和Ubuntu)
    1
    sudo apt-get install build-essential git subversion wget flex gettext libncurses5-dev unzip gawk liblzma-dev zlib1g-dev ccache u-boot-tools
  2. Checkout项目代码
    1
    git clone https://github.com/rssnsj/openwrt-hc5x61.git
阅读全文 »

用法

Selector的主要方法有三个:

  • Selector.open():Selector
    主要用于创建一个selector
  • select():int
    该方法有两种模式:在阻塞模式下,该方法会一直阻塞,直到超时或者有注册的事件发生,返回发生事件的数量;在非阻塞模式下,会立即返回,如果没有事件发生,则返回0。
  • selectedKeys():Set
    获取已经就绪的事件的key的集合。

Selector.open()原理

通过阅读java.nio.channels.Selector的源码(如下),可以发现,其调用了SelectorProvider.provider()的openSelector()函数。

1
2
3
public static Selector More ...open() throws IOException {
return SelectorProvider.provider().openSelector();
}

先看SelectorProvider.provider(),在这个函数中,保证了provider有且仅有一个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static SelectorProvider provider() {
synchronized (lock) {
if (provider != null) //保证只有一个
return provider;
return AccessController.doPrivileged(
new PrivilegedAction<SelectorProvider>() {
public SelectorProvider run() {
if (loadProviderFromProperty())
return provider;
if (loadProviderAsService())
return provider;
provider = sun.nio.ch.DefaultSelectorProvider.create();
return provider;
}
});
}
}
阅读全文 »

主要属性

  • capacity
    作为一个内存块,Buffer有一个固定的大小值,也叫capacity.你只能往里写capacity个byte、long、char等类型。一旦Buffer满了,需要将其清空(通过读数据或者清除数据)才能继续写数据往里写数据。

  • position
    当你写数据到Buffer中时,position表示当前的位置。初始的position值为0。position最大可为capacity–1。当读取数据时,也是从某个特定位置读。当将Buffer从写模式切换到读模式,position会被重置为0。当从Buffer的position处读取数据时,position向前移动到下一个可读的位置。

  • limit
    在写模式下,Buffer的limit表示你最多能往Buffer里写多少数据。写模式下,limit等于Buffer的capacity。当切换Buffer到读模式时,limit表示你最多能读到多少数据。因此,当切换Buffer到读模式时,limit会被设置成写模式下的position值。换句话说,你能读到之前写入的所有数据。

  • 三者关系如下:

Buffer构造器

尽管Buffer是一个抽象类,但是依然有自己的构造器。
其主要作用是初始化抽象类的成员和子类的初始化。

1
2
3
4
5
6
7
8
9
10
11
12
13
Buffer(int mark, int pos, int lim, int cap) {       // package-private
if (cap < 0)
throw new IllegalArgumentException("Negative capacity: " + cap);
this.capacity = cap;
limit(lim);
position(pos);
if (mark >= 0) {
if (mark > pos)
throw new IllegalArgumentException("mark > position: ("
+ mark + " > " + pos + ")");
this.mark = mark;
}
}
阅读全文 »