[笔记]计算机网络·链路层

 

对计算机网络还很不了解,最近要考试了,于是翻了一下笔记,复习一下,不知道笔记内容有没有错?

 

数据链路层的主要任务是将一个原始传输设施转变成一条逻辑的传输线路,在这条传输线路上,所有未检测出来的错误会反映到网络层上。

数据链路层完成这项任务的做法是:让发送方将输入的数据拆开,分装到数据帧(Data frame,通常为几百个或者几千个字节)中,然后顺序地传送这些数据帧。
如果是可靠的服务,则接收方必须确认每一帧都已经正确地接收到了,即给发送方送回一个确认帧(acknowledgement frame)。
 
数据链路(data link) 除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
 

Glib::RefPtr<>

因为最近要做C++的作业,所以看了看Gtkmm,我觉得这个库还是挺强大的。对于个人来说,从Java到C++不习惯的就是指针的问题了。Java的“指针”是引用的概念,JVM提供一个引用计数器来对资源进行管理,因此,新建对象后就不用对这个对象的内存管理了(引用计数为0时,清除对象)。而C++的指针却不同,我们用new分配内存后,还必须delete才算把这个对象删除。

而Glib::RefPtr就是在C++中实现JVM的引用计数功能(Reference Pointer)。利用Glib::RefPtr,可以简化对共享资源的管理。

不过对Glib::RefPtr<>的理解还在很初始的阶段。只是翻译一下官方文档……


基本使用

Glib::RefPtr<>的基本功能和普通指针差不多,意味着类似复制、调用方法、自动类型转换、空指针检查等和普通指针是没有差别的。因此

Glib::RefPtr<Gdk::Bitmap> refBitmap = Gdk::Bitmap::create(window,data, width, height);
Glib::RefPtr<Gdk::Bitmap> refBitmap2 = refBitmap;
Glib::RefPtr refBitmap = Gdk::Bitmap::create(window,data, width, height);
int depth = refBitmap->get_depth();
Glib::RefPtr<Gtk::TreeStore> refStore = Gtk::TreeStore::create(columns);
Glib::RefPtr<Gtk::TreeModel> refModel = refStore;
Glib::RefPtr<Gtk::TreeModel> refModel = m_TreeView.get_model();
if(refModel)
{
    int cols_count = refModel->get_n_columns();
    ...
}

但要注意的是,不能直接对Glib::RefPtr<>进行*操作访问内在实例。否则会造成编译错误。

另外,对Glib::RefPtr<>进行强制类型转换也是需要注意的。应该用

Glib::RefPtr<类型名>::cast_dynamic(待转换变量) // or Glib::RefPtr<...>::cast_static(...)

进行强制类型转换。


Constness 

关于Constness(我看到别人把它译为常量性),我看了译文以后也不是很明白,不过指向的译文中好像翻译有点问题……一开始没看懂。

You might not realise that const Something*declares a pointer to a const Something, The pointer can be changed, but not the Something that it points to.

这句话应该说的是“你可能注意到const Something*声明了一个指向const Something的指针,指针可以变,但所指向的内容不能变。”即内容是常量而不是指针是常量。

对于Glib::RefPtr<>来说也是那样,const Something*等价于const Glib::RefPtr<const Something>&,突出const Something应该当作一个整体类型。

不过我也还没怎么看懂官方文档关于常量性的描述的用处,大概在于描述怎样设计参数传递吧,也没怎么弄明白,或许我现在还在简单地进行开发阶段吧。

Glib::RefPtr<>的官方文档:http://developer.gnome.org.sixxs.org/gtkmm-tutorial/unstable/chapter-refptr.html.zh_CN

日记

虽然以前说过不很想写日记,但其实除了日记以外,我也不知道有什么更合适的题目。

 

NASM 文档 - Section 3

这篇翻译是当时学习汇编语言的时候写的。当时课本用的是MASM,但可惜MASM没有Linux版,因此,用起来不太方便。于是,参考了Linux下一些汇编器的语法后,觉得NASM和MASM的比较相似,于是就试着看NASM的文档,也试着翻译。所以,这里只是翻译了第三节,关于NASM语法的文章。

关于NASM更多信息,请访问:http://www.nasm.us/

写点什么吧

今天开学已经第二周了。不过连接 www.is-programmer.com 的网络状况似乎不是很好,校园网还没有申请。

昨天某人发的短信的确使我感动很温暖。短短的几条短信,或许真的可以改变一些看法。或许那个人终于注意到我了吧。去了剪头发,呃,现在的发型很有军训的感觉。仿佛又到军训的时候。不过晚上的时候有点无奈,或许我不应该再发短信吧。要找我的人不需要我去找……嘿嘿。

终于开始学习 C++ 和 VB.NET 了。不过,觉得高级语言似乎都类似,主要是运用语言的思想不同。不过汇编确实有点无奈啊……主要是学习的是 MASM,不支持 Linux ,而语法上和 NASM 等又不同,于是去下载用着一个 D 版的 Windows XP 吧。学习这门课程主要希望了解编译和内存储存的结构,但要考试,还是得依赖 Windows……

现在为 ylinux.org 写着部分代码,当作练习吧。不过现在要做的是先把一个网站的 mockup 做出来。先前的设计都是比较凌乱,一方面是继承原来不同的设计方案的基础上来做小修改。而现在应该做一个整体的规划了。

为了记事而记事

不知道从什么时候开始,我也会自己一个人出去,漫无目的地走。或许,这一年以来的事情真的太多了,我需要时间去理解。

想起高三毕业的时候,我写给自己的一首英文小诗:

Since the start of the summer ,
I had been waiting for something .
Around me stood many people
waiting for something
Some said its name is college .
Some said its name is jobs .
Some said its name is opportunities .
But the one who return
told us that
its name is time . . .

我的确在期待什么,但我自己却一直说不清。于是,也连累了不少的人,有些人我不知道怎样去面对,也不怎么想结识新的朋友。我觉得自己的能力确实有限。有很多事情,不是我想做就能做。
也许要放弃一些东西吧。但我现在想要的是什么呢?我似乎在浪费时间,但我又说不出我不这么浪费时间可以做些什么?

有的人在准备 ACM/ICPC ,有些人在跟着老师做一些项目,有些人去社会实践……我呢?我应该做些什么?迷失比走在路上的艰辛更可怕。

其实反思现在的我,没有高中的基础,基本上就是现在才想到学习算法,对比一些 NOI 的牛人,应该说真的差很远。

Smile

上学期末的时候写的一个小程序,用于练习 Java2D 编程。我觉得图形编程还是挺有趣的。

记得学期末的时候,某人发短信过来说对编程还是没很多兴趣。嘿嘿,其实我觉得其实编程就不过是实现生活中的事情而已。于是写了这个小程序。希望见到这个小程序也会开心一下吧。

也应该说一下。版权不在我这里,我只是用 Java 参考 Xorg 中的 Xeye 示例程序、加入一些鼠标事件处理写的。

大家可以参考一下源码吧。虽然现在看回原来写的代码,我也觉得写得不是很好(思路不清晰,但代码不长)……需要注意的是,我使用了 JRE 7 的新特性,所以,必须在 JDK 7 下编译。
实际上是因为加入了这些语句:

frame.setShape(new  
	java.awt.geom.Ellipse2D.Double(
		0, 0, 
		frame.getWidth(), 
		frame.getHeight()));
try {
	frame.setOpacity(0.8f);
} catch(Exception ex) {
}

其实还有一些动态效果的。截图就不多发了。

嗯,其实我希望大家见到这个程序都会开心。

下载:http://www.boxcn.net/shared/il58j4fm96mkj6nj0s69

源码:http://www.boxcn.net/shared/umi549k2vjsir2lzc25a

TankII update 1.2.1

考虑到以前同学说过的按键问题,现在修正了一下。不过,要更准确地控制坦克的炮筒位置,就需要两副方向键。而现在 ASDW 和 方向键 (功能和ASDW一样)都用了,于是想到 VI 的键盘模式 HJKL 。

修改记录:

  • 更改键设定,H、J、K、L 控制坦克炮筒角度。

所以,现在是,举例来说,无论现在炮筒在什么方向,只要按了 H 那么就会沿最短的路径向左( J 对应“向下”、K 对应“向上”、L 对应“向右”)。

这个修改太小了。所以就只是更新一个小版本号吧。基本上就修改了 TankKeyListener 类。

下载地址:http://www.boxcn.net/shared/1v7lhfdfumj08sxoktsl (其实下载地址没怎么变,用了 box.net 的文件版本功能)

Log 2011.8.11

昨天在回顾 POJ 3349 的时候,想起了散列表(Hash Table)的数据结构。提醒了我在 TankII 的对象碰撞的时候应该处理的一些事情,对需要检测的对象先进行粗略的分类然后再继续判断,这样的话,对 TankII 设计里可以减少实际碰撞检测的时候。这需要的就是一个散列函数了。这个散列函数应该满足的是把几个顶点坐标处理成一个数,如果所有坦克都可以通过这个数判断粗略分出可能造成碰撞的坦克的话,游戏的刷新间隔应该可以缩减到更短,有利于其他额外的绘制处理。但这个散列函数也不是容易找的。也只是我的一个很原始的想法而已。而且,散列表应该是对应静态分类(储存的对象基本是确定的)的,而我所需要的是动态分类,也是一个难题,还在探索中……

现在总算是对数据结构有些初始的理解了。

还有就是对 Java2D 的一些不满,似乎 Java2D 中的结构都是静止的结构,没有考虑到这个对象用作动画的一部分?如 Rectangle2D 这样的对象,虽然提供了 getCenterX() getCenterY() 这样的方法,但对 Rectangle2D 内顶点的修改却很少涉及。但看 OpenJDK 中 Rectangle2D 的实现,其实是可以增加额外的修改图像的方法的。而且碰撞检测也是基于变量的,这样修改也不会造成性能的问题吧?只有一个不方便的 setRect(doulbe x, double y, double w, double h) 来进行整体修改。当然,也是一个解决办法。相比起 Pygame 的 Rect 类就差远了。

随便说说

话说前几天驱动人生终于识别出 ATI Radeon 6470M 的 Windows XP 的驱动,于是我懒得去安装 Windows 7 了。

用着,发现 Windows XP 还是不错的,主要他的外围软件的完善。事实上,XP 在很多方面都没有 Linux 上的 KDE 或者 GNOME 先进了。但有着强大的外围软件,却是 KDE 或者 GNOME 都比不上的。赞一下 Opera ,它的邮件集成管理还是很好用,比 Firefox 要好一点,但是 Opera 的渲染引擎还是不够好(对新标准支持上,虽然其实那些新标准也还不很正式,但缺少一些比较方便的东西如CSS动画)。但现在 XP 似乎没有日程表的集成。写着写着好象又看出很多小问题了……

不过现在还是缺少开发环境。安装 Microsoft Visual Studio 2010 Express 应该是必要的。毕竟回到学校又学 Visual Basic.NET 了。不过现在还是先选择安装 MinGW ,做一个小型的开发环境。最近在 POJ 上做题,渐渐地学习一些算法吧。

看着下学期的课程表,应该又比较忙了。离散数学、Visual Basic 程序设计、通信概论、英语六级……现在就看了看离散数学。不过也要准备一下英语六级了,拖下去对自己学习也是没有好处的,上学期英语四级就准备得很散。好象查成绩的日期也快到了吧?希望顺利通过,然后好好准备六级。

嗯,昨天考了驾驶考试的科目一,不过在假期再考科目二比较勉强。现在正纠结着究竟要不要提前回学校。没有人通知,就是说不会有官方任务。呃,当然,还有社会实践要完成……