好久都没有更新自己的博文了。回想下都不知道那些没有博文记录的日志里都在做什么!
平日里想写点博文,但总觉的又写不出点什么内容。我想,问题应该是这样的:自己的大部分时间都在工作上,但是自己却不想写个工作相关的内容吧。所以,现在要转变思想,记录下自己的所想所做。
局域网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中的函数了。
二、动态库的显式调用,显式调用动态库步骤:
- 创建一个函数指针,其指针数据类型要与调用的 DLL 引出函数相吻合;
- 通过 Win32 API 函数LoadLibrary()显式的调用DLL,此函数返回DLL 的实例句柄;
- 通过 Win32 API 函数GetProcAddress()获取要调用的DLL 的函数地址,把结果赋给自定义函数的指针类型;
- 使用函数指针来调用 DLL 函数;
- 最后调用完成后,通过 Win32 API 函数FreeLibrary()释放DLL 函数。
使用WinSocket编程
下面是WinSocket编程的一般步骤:
- 初始化,调用WSAStartup(DWORD, LPWSADATA);
- 创建Socket,调用socket(int af, int type, int protecol);
- 绑定端口,调用bind( SOCKET s, const struct sockaddr FAR *name,int namelen );
- 监听,调用listen(SOCKET s, int backlog);
- 调用send 后recv,发送和接收数据
- 关闭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
所以服务端打印的结果就错误了。