代码改变世界

[记忆]5月第二周

2012-05-13 13:25  风过浪静  阅读(219)  评论(1编辑  收藏  举报

好久都没有更新自己的博文了。回想下都不知道那些没有博文记录的日志里都在做什么!

平日里想写点博文,但总觉的又写不出点什么内容。我想,问题应该是这样的:自己的大部分时间都在工作上,但是自己却不想写个工作相关的内容吧。所以,现在要转变思想,记录下自己的所想所做。

局域网ip

在做一个局域网内网络情况查看工具时,碰到扫描局域网内存活的计算机问题。由于自己对网络知识的匮乏,不知道这个网段的范围。在网上查了下相关知识。

局域网可用的ip地址范围为:

  • a类    10.0.0.0 - 10.255.255.255
  • b类    172.16.0.0 - 172.31.255.255
  • c类    192.168.0.0 -192.168.255.255

现在我的程序里面扫描同网段的计算机时,假设的是同一个网段内最多只有256台计算机。这点我现在还存有疑惑,比如a类局域网,从地址范围上来看可远远不止256。

大学我学的还是网络工程专业的,看来是白学了(网络的课程全逃了)。

代码规范

最近我在看两本书:《clean code》和《the art of readable code》。这两本书都是讲如何写代码的,怎样写代码更规范、更易于他人理解。

一个项目的主要工作有两部分:开发和维护,维护的时间也往往比开发的时间长。如果开发时写出的代码混乱不堪的话,以后的维护工作将困难重重。

代码缩进

代码规范中有一个规则,代码的横向字符数不能超出一定的数量,我个人的设置是80个字符。但是我们平时就会碰到有些情况会让一行代码变得很长很长很长,如:if中的判断条件,过多参数的函数。

if中的判断条件
//缩进前
if(student->age > 18 || student->weight > 50 || student->name == "test" || student->class == 23 || student->school == 34)
{
//do something
}

//缩进后
if(student->age > 18 ||
student->weight > 50 ||
student->name == "test" ||
student->class == 23 ||
student->school == 34)
{
//do something
}
过多的参数函数
//缩进前
bool retval = DoSomething(argument1, argument2, argument3);

//缩进后
bool retval = DoSomething(argument1,
argument2,
argument3,
argument4);


DLL的加载

以前用asp.net 做网站的时候,加载dll只要在项目中添加下引用便可以了,so easy。可是并不知道它加载dll的原理。现在做本地代码开发,碰到使用其他dll中封装的方法,但自己对加载非托管的dll不熟悉。

在VC中两种方式的具体方法:

一、动态库的隐示调用

在 VC 工程中直接链接静态输入库XXX.lib,然后即可像调用其它源文件中的函数一样调用DLL中的函数了。

二、动态库的显式调用,显式调用动态库步骤:

  1. 创建一个函数指针,其指针数据类型要与调用的 DLL 引出函数相吻合;
  2. 通过 Win32 API 函数LoadLibrary()显式的调用DLL,此函数返回DLL 的实例句柄;
  3. 通过 Win32 API 函数GetProcAddress()获取要调用的DLL 的函数地址,把结果赋给自定义函数的指针类型;
  4. 使用函数指针来调用 DLL 函数;
  5. 最后调用完成后,通过 Win32 API 函数FreeLibrary()释放DLL 函数。

使用WinSocket编程

下面是WinSocket编程的一般步骤:

  1. 初始化,调用WSAStartup(DWORD, LPWSADATA);
  2. 创建Socket,调用socket(int af, int type, int protecol);
  3. 绑定端口,调用bind( SOCKET s, const struct sockaddr FAR *name,int namelen );
  4. 监听,调用listen(SOCKET s, int backlog);
  5. 调用send 后recv,发送和接收数据
  6. 关闭socket连接

这个是我写的一个demo:https://github.com/kkfnui/Experiments/tree/master/Win_Socket

宽窄字符造成的问题

在写这个demo的时候出了一个bug困惑了我好久,就是服务端调用cout 方法打印数据的时候只能打印出来字符串第一个字母

cout << clientHostInfo->szHostName << endl;

开始我以为是cout 不能打印字符数组导致的,可是在网上搜索了半天也没有结果。

最后才发现客户端发送的数据是unicode编码的,一个字符站两个字节。而服务器是使用窄字符编码,一个字符占一个字节。碰巧客户端传送都是因为字母,所以在服务端解析出来的结果便是:

l \0 v \0 f \0 e \0 i \0 – \0 p \0

所以服务端打印的结果就错误了。