zoukankan      html  css  js  c++  java
  • [记忆]5月第二周

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

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

    局域网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

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

  • 相关阅读:
    类之间的关系:关联、组合、聚合、依赖关系比较
    贫血模型和充血模型
    WCF(五) 深入理解绑定
    WCF(四) 绑定
    WCF(四) 深入契约
    PythonStudy——函数默认值
    PythonStudy——函数的参数 Function argument
    PythonStudy——函数的返回值 The return value of the function
    PythonStudy——函数的分类 Classification of functions
    PythonStudy——函数的使用 Use of functions
  • 原文地址:https://www.cnblogs.com/kkfnui/p/2498064.html
Copyright © 2011-2022 走看看