VC++编程之道读书笔记

第二篇数组

缪误21:位图数据是按照红绿蓝顺序存储的网络

你们都知道位图的颜色是由红、绿、蓝三个份量构成的,可是位图颜色数据存储的方式则不是按照这个顺序存储的,而是按照蓝、绿、红的顺序存储的。而且对于真彩色位图来讲,位图的颜色数据是倒序存储的,即位图的第一行数据位于位图数据的最底部。socket

第三篇函数

细节12 :内存中的数组性能

在C++中经过数组能够操做内存,建立数组时须要为数组分配内存空间,操做数组时就是对内存空间中的数组元素进行操做。数组建立后,数组引用和数组元素分别存储在栈内存和堆内存中,并经过数组引用与数组元素的下标对数组元素进行操做。(数组引用即数组名)设计


细节18:使用省略号做为函数的参数指针

省略号参数表明的含义是函数的参数是不固定的,能够传递一个或多个参数。对于printf函数能够输出一项信息,也能够输出多项信息。
定义带省略号参数的函数以下:
void OutPutInfo(int num, ...)
{}内存

对于上述方式的函数,在编写函数体时须要一一读取用户传递的实际参数。可使用va_list类型、va_start、va_arg、va_end 3个宏读取传递到函数中的参数值。作用域

细节19:函数的重载开发

一、函数的返回值类型不能做为区分重载函数的一部分。

二、对于普通函数参数来讲const关键字不做为区分重载函数的标识,可是若是参数的类型是指针或引用类型,则const关键字将做为重载函数的标识。所以,下面的函数重载是合法的:

bool Validate(const int *x){}

bool Validate(int *x){}

三、参数的默认值不做为区分重载函数的标识。

四、使用typedef自定义的类型不做为重载的标识

五、局部域中声明的函数将隐藏而不是重载全局域中的函数。
bool Validate(float x)
{
    printf("浮点参数函数\n");
    return (x>0) ? true : false;
}

int main(int argc, char **argv)
{
    bool Validate(double x);
    Validate(10.5f);
    return 0;
}

此时main函数中的Validate将全局函数隐藏而不是重载了全局函数,须要注意的是,函数重载是发生在同一做用域下的同名函数。若是此时须要使用全局函数,可使用全局做用域符::。

细节25:析构函数

注意析构函数的调用顺序与构造函数相反。

细节42:指针引用做为函数参数

void TestPtr(int* &pArray);

第七章
细节26:TCP粘包的烦恼
TCP协议为传输数据提供了可靠的保障。可是,对于技术开发人员来讲,使用TCP协议有一个最大的烦恼,就是出现粘包的状况。一般,用户在对一组数据分组发送的时候,系统为了提升性能会将多个数据包组合到一块儿,而后统一发送。用户在接收数据包的时候,有时会一次接收到多个数据包,有时也会接收到一个不完整的数据包(数据包的余下部分在下次接收数据中),这要视当时的网络状况而定。这就是说用户在发送数据时,虽然逐个数据包发送,可是系统为了提升性能,会批量地发送多个数据包,而接收端每次接受的内容可能包含多个数据包,也可能包含一个数据包的一部分数据。例如,一次接受3个数据包数据、2.2个数据包数据或者0.4个数据包数据。这就要求开发人员在设计接收端时须要本身对各类状况进行处理。可是一般使用一个原则是本身定义的数据包的结构不要太大,也就是在接收端首次结束数据时,可以获取到一个完整的数据包结构。
细节29:套接字的阻塞模式
依据套接字执行方式的不一样,能够将套接字分为两类,即阻塞套接字和非阻塞套接字。在阻塞套接字中,套接字函数的执行会一直等待,直到函数调用完成才返回。在非阻塞套接字中,套接字函数的调用会当即返回,将控制权交给程序。
默认状况下,套接字为阻塞套接字。为了将套接字设置为非阻塞套接字,须要使用ioctlsocket函数。例如,下面的代码在建立一个套接字后,将套接字设置为非阻塞套接字。
unsigned long nCmd;
SOCKET clientSock = socket(AF_INET, SOCK_STREAM, 0);
int nState = ioctlsocket(clientSock, FIONBIO, &nCmd);
if(0 != nState)
{
    MessageBox("设置套接字非阻塞模式失败");
}
细节30:定义用户通讯协议
协议是通讯双方进行交互的基石。它定义了双方通讯的规则。咱们在开发网络应用程序时,一般都须要本身定义一个协议。例如,设计一个聊天程序,用户可能传递文本信息、文件数据或表情信息。每一种信息咱们在封装数据包时都须要有一个标志位来标记数据的类型。接收端读取数据包中的协议,根据不一样类型的数据进行相关操做。这就是一个简单的网络通讯协议。其实,我认为http、ftp、telnet等等,这些就是这样定义出来的。
细节31:抓取网络数据包
当用户在局域网中传递数据时,处于同一网段内的全部计算机的网卡都会收到这些数据,尽管它不是传递数据的目的地。利用这一特色,咱们就能够截获局域网中传递的数据。
为了能获取经过网卡的数据,须要建立原始套接字。用户能够将socket函数的第二个参数设置为SOCK_RAW来建立原始套接字。例如:
m_sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
由原始套接字获取的数据是IP数据报,而不只仅是一个用户数据。它还包含IP数据头和相应协议的数据头,最后才是用户数据。为了得到用户数据,须要逐一去掉IP数据头及各个协议的数据头。

细节39:任务栏托盘菜单要设计任务栏托盘菜单,须要使用Shell_NotifyIcon函数。

相关文章
相关标签/搜索