在工作中,经常需要远程登录到机房中的设备上进行调试与开发,走的是工作局域网。由于这些设备的地址也是动态获取的,因此在遇到一些意外事故,如网线松了、网络不稳定之类的,这些地址可能就变了。每当这时,我们就得跑到机房,给设备连上显示器(我们连 KVM 都没有,命苦啊),查看 IP ,然后再跑回去重新连。太麻烦了。
我知道有支持动态地址的 DNS 服务,可是我们没权限操作 DNS 服务器,而且设备也都是不固定的,没必要惊动网络管理员(好吧,我甚至都不知道谁是网络管理员,作为三年的“老”员工,我面壁去了。好吧,其实我就是想写写程序练练手),所以我就写了个小程序,用来查找一台特定设备的 IP 地址。
原理其实很简单啦。客户端(也就是我的笔记本)发个 UDP 广播报文,里面有要找的主机的名字。服务端呢,启动时则指定一个主机名字。当服务端收到一个 UDP 广播报文,并且发现找的就是自己呢,就返回一个 bingo
报文。这样,客户端就知道这个主机的 IP 地址啦。
我的编译环境是 Visual Studio Team System 2008 版本 9.0.21022.8 RTM , Windows Mobile 5.0 SDK R2 ( VS2008 自带的版本)。当然, Perl 也是需要的,我装的是 ActivePerl 。我要编译的 OpenSSL 版本是 0.9.8e 。
VS2008 的安装
那个 Web Developer Tools (好像叫这个)的安装会失败,又不能不装,根据网上的说明,要把它的目录单独从光盘上解压出来安装,且安装的时候要挂 Office 的安装光盘(我的 Office 版本是 2007 )。这个装好了之后,再从光盘上安装 VS2008 就没有问题了。
C/C++ 中的宏是个让人又爱又恨的家伙(感觉这句话好俗啊),在带给我们很强大的 Power 的同时,却也需要我们绝对的细心,而这也是在宏定义中诸多惯用法的由来。
当我们要把一组语句定义成一个宏,并希望像用一条语句那样来使用它的时候,我们就可以这样做:
我以前只知道,在 C++ 中,如果要表示一个类是抽象基类,只要为它定义一个纯虚析构函数就可以了,没想到今天用到的时候才发现,连接的时候通不过,说没有找到那个函数的定义。到网上一搜才知道,原来纯虚函数也是可以有定义的啊。在实现文件中加上它的空定义之后,一切就 OK 了。
不过,因为我那个基类里面已经有了一个纯虚函数,所以貌似没必要把析构函数也定义成纯虚的。
PS. 在 C++ 里面要实现 AST 还真是一件麻烦的体力劳动,要写那么多类,每个类还得写那么一砣的样板代码。幸好不是那种长期运行的服务器程序,不需要太考虑 memory leak 的问题,就不用写析构函数和 delete
了(实际上是懒得写),不然样板代码还要更大砣。不知道有什么更好的方法没。