一、内存管理基础
win32中的内存管理是分层次的,系统提供了几组层次不同的函数来管理内存,它们是
标准内存管理函数、堆管理函数、虚拟内存管理函数和内存映射文件函数。
windows充分利用了80X86处理器保护模式下的线性寻址机制和分页机制,这些机制是
win32内存管理的基础。
1)虚拟内存管理函数:管理虚拟内存,主要用于保留/提交/释放虚拟内存,在虚拟内存
页上改变保护方式、锁定虚拟内存页,以及查询一个进程的虚拟内存等操作,这是一组位于
底层的函数。
2)堆管理函数:堆的主要功能是有效地管理内存和进程的地址空间。win32中,进程可以
使用的整个地...
以前看计算机网络相关的书,每次看到IP或者UDP报头校验和时,都一瞥而过,以为相当简单,不就是16bit数据的相加吗。最近在研究《TCP/IP详解 卷1:协议》这本书,看到校验和是16bit字的二进制反码和(晕,以前都没注意原来是反码和,看来以前看书不仔细啊!罪过,罪过~~),觉得很奇怪,为什么会用反码和,而不是直接求和呢?(因为我认为TCP/IP协议里面的算法和思想一般都是非常经典的,人家这么做一定有原因的)下面就来探索一下这个校验和算法具体怎么实现的。
首先,IP、ICMP、UDP和TCP报文头部都有校验和字段...
/**
* 功能:
* 位运算符,原码、反码、补码规则:
* 1.二进制的最高位是符号位:0表示正数,1表示负数
* 2.正数的原码、反码、补码都一样
* 3.负数的反码=它的原码符号位不变,其他位取反
* 4.负数的补码=它的反码+1
* 5.0的反码,补码都是0
* 6.java没有无符号数,换言之,java中的数都是有符号的
* 7.在计算机运算时候,都是以补码的方式来运算...
Windows使用两种字符集ANSI和UNICODE,
前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。
而后者是双字节方式,方便处理双字节字符。
Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。_T一般同字常数相关,如_T("Hello")。如果你编译一个程序为ANSI方式,_T实际不起任何作用。
而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。
_T()和_L()...
计算器的实现:
1)业务逻辑代码
/************************************************
Class: 运算类
Description: 各种运算的父类,提供公共接口
************************************************/
class COperation
{
public:
double m_nFirst;
double m_nSecond;
public:
virtual double GetResult()
{
return 0;
}
...
netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息,
语 法:netstat [-acCeFghilMnNoprstuvVwx][-A网络类型>][--ip]
补充说明:利用netstat指令可让你得知整个Linux系统的网络情况。
参 数:
-a或--all 显示所有连线中的Socket。
-A网络类型>或--网络类型> 列出该网络类型连线中的相关地址。
-c或--continuous 持续列出网络状态。
-C或--cache 显示路由器配置的快取信息。
-e或--exten...
使用VC6.0编译。为了测试方便,服务器端只接收一次数据,当客户端关闭后,服务器端也随之关闭。
服务器端代码:
#include "../common/InitSock.h"
#include <stdio.h>
CInitSock theSock; //加载套接字库
int main()
{
USHORT nPort = 4567; //此服务器监听的端口号
//创建监听套接字
SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
so...
/**
* 功能:二分查找
* 基本思想:
* 假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,
* 如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的
* 前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到
* 找到为止。
* 作者:徐守威
*/
package com.xushouwei;
p...
/**
* 功能:插入排序法
* 基本思想:把n个待排序的元素看成一个有序和无序表,开始时有序表中只包含一个元素,
* 无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码
* 依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有
* 序表。
* 作者:徐守威
*/
package com.xushouwei;
...
虚(virtual)函数的一般实现模型是:每一个类(class)有一个虚表(virtual table),内含该class之中有作用的虚(virtual)函数的地址,然后每个对象有一个vptr,指向虚表(virtual table)的所在。
请允许我援引自深度探索c++对象模型一书上的一个例子:
class Point {
public:
virtual ~Point();
virtual Point& mult( float ) = 0;
float x() const {...
第一:private, public, protected 访问标号的访问范围。
private:只能由1.该类中的函数、2.其友元函数访问。
不能被任何其他访问,该类的对象也不能访问。
protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。
但不能被该类的对象访问。
public:可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,也可以由4.该类的对象访问。
注:友元函数包括3种:设为友元...
今天复习关于运算符重载这一章节,以前学习的时候用的是gcc编译器, 在VC6.0的时候会遇到莫名其妙的问题:
--------------------Configuration: integer1 - Win32 Debug--------------------
Compiling...
integer.cpp
D:\My Documents\我的工程\integer1\integer.cpp(9) : fatal error C1001: INTERNAL COMPILER ERROR
(compiler f...
最近一直在给项目代码加注释,因为结项有一项工程性的要求是注释占到总行数的额50%,这几天可苦了我们几个。前几天为了统一项目组的注释规范,专门整理了一份,以后可能也用得着,放着备份下。
1 源文件头部注释
Ø 列出:版权、作者、编写日期和描述。
Ø 示例:
/*************************************************
Copyright:bupt
Author:
Date:2010-08-25
Des...
微软再这么下去危险了
一、什么是字节对齐,为什么要对齐?
现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适...
做过网管或协议分析的人一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包。抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议、IP、UDP、TCP、甚至各种应用层协议),敏感数据的捕捉等。下面我们就来看看在windows下如何实现数据包的捕获。
下面先对网络嗅探器的原理做简单介绍。
嗅探器设计原理
嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与...
sscanf() - 从一个字符串中读进与指定格式相符的数据。
swscanf()- 用于处理宽字符字符串,和sscanf功能相同。
一、函数原型:
int sscanf( const char *, const char *, ...);
int sscanf(const char *buffer,const char *format,[argument ]...);
buffer存储的数据
format格式控制字符串
argument 选择性设定字符串
...
#include <iostream>
using namespace std;
class c1
{
public:
int val;
c1(int i) { val = i; }
int double_val() { return val + val;}
};
int main()
{
int c1::*data; //data member pointer
int (c1::*func)(); //function member pointer
c1 ob1(1), ob2(2); //create objects
data...
shared_ptr是一个最像指针的“智能指针”,是boost.smart_ptr库中最有价值、最重要的组成部分,也是最有用的。
shared_ptr实现的是引用计数的智能指针,可以被自由拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。shared_ptr也可以安全地放到标准容器中。
示例1:
#include <boost/smart_ptr.hpp>
#include <iostream>
#include <cassert>
using namespace boost...
scoped_ptr不允许拷贝、赋值(因为scoped_ptr同时把拷贝构造函数和赋值操作符都声明为私有的,禁止对智能指针的复制操作),只能在scoped_ptr被声明的作用域使用。除了*和->外也没有定义其他的操作符(不能对scoped_ptr进行++或者--等指针算术操作)。
示例如下:
#include <boost/smart_ptr.hpp>
#include <iostream>
#include <string>
using namespace boost;
using namespace std;
int main()...