摘要:
技巧6:TCP是一种流协议TCP是一个流协议,跟流水一样,是没有边界的,也就是说如果B端第一次发送100个字节,第二次发送200个字节,当我们读取的时候,是根据缓冲区的大小来看读取结果的,如果我们缓冲区大于300,那么将会把全部读取出来,如果小于300,例如150,则会读取第一个和第二个的50个字节,这样需要我们去处理边界的问题,一般是通过加消息头来确定,而UDP则没有这个问题技巧9:TCP是个可靠的,但不是完全可靠的1.假设一个A主机TCP数据包发送给B主机,B主机成功收到,但是还没有复制到应用程序,这个时候B主机已经把ACK已经发给了发送A主机,A主机确认B主机已经接收到数据包,但是B注意 阅读全文
摘要:
在windows下开发C++程序的时候,我们经常需要用到malloc开申请内存,然后利用free回收内存,但是开发人员的不小心可能会忘记free掉内存,这样就导致了内存泄露1.利用库检测内存泄露信息#define _CRTDBG_MAP_ALLOC //如果没有这个宏定义,我们只能知道有内存泄露,却无法知道在哪个地方申请内存忘记了释放#include <stdlib.h>#include <crtdbg.h>int main(void){ char *p = (char *)malloc(sizeof(char) * 100); _CrtDumpMemoryLeaks( 阅读全文
摘要:
1.C调用python其实C与python的交互很简单,最简单的就是下面的例子:1 Py_Initialize();2 3 PyRun_SimpleString("str = \"hello\"");4 PyRun_SimpleString("print str");5 6 Py_Finalize();与C在进入main函数前要做一些准备工作一样,所有要与python进行交互的程序开头都是以Py_Initialize()开头,无非就是申请一些预备的资源,结尾用Py_Finalize()释放申请的资源,C程序在main函数完毕后也会进行 阅读全文
摘要:
python里面也引入了面向对象的方法,除了一些C++的基本概念,还有其他一些不同,例如python的类有时候可以作为一个命名空间1 class MyData(object):2 passpython的继承语法是class class_name(parent_class_name),所以上面的MyData对象继承与object对象,至于object对象,则是python的内置对象,暂且不谈上面的就是声明了一个空类,但是和C++不同的是,这个类本身可以当作一个命名空间使用,例如:1 mathObj = MyData()2 mathObj.x = 43 mathObj.y = 54 mat... 阅读全文
摘要:
1.适配器模式(Adapter)基础教程看了<<设计模式>>和这篇文章,觉得适配器的一个重点就是对象所提供的接口并不一定能适应我们的新环境,我们就要对其转换成我们需要的接口(其实不适应新环境就是类成员函数名称不一样,无法通过父类指针直接操作子类)设计模式里面有一个例子就是在程序上绘制几何图形的问题,我们有LineShape,PolygnShape都继承自Shape,也有统一的接口,比如有个接口BoundingBox,现在我们要加入一个TextShape,一般是要自己重新写一个,但是已经有程序库提供了TextView经过稍微更改可以满足我们的需求,但是类的成员函数名跟我们 阅读全文
摘要:
例如有一个base类型的class,有成员函数fun,当执行class.fun(),那么C++编译器会先进行如下转换:如果是非静态函数成员:1.改写函数原型,class.fun()变成class::fun( base const *this),如果是const,则变成class::fun(const base const *this)2.将fun函数里面对于非静态成员函数的存取操作改成又this指针来存取,比如fun里面访问了成员函数a,那么编译器会改写成this->a3.对成员函数经过mangling,即矫正,变成外部函数,而这个外部函数的名称是独一无二一的,比如class.fun() 阅读全文
摘要:
所谓异步IO,就是当线程向设备驱动程序发送一个IO请求后,线程不会等待处理,而是继续执行,设备驱动程序去完成实际的IO操作,再通过其他方式通知程序注意:如果我们发送一个异步IO请求给设备驱动程序,设备驱动程序不一定会以异步处理IO请求,有时候会选择以同步的方式来请求。当我们IO请求发送后,操作系统检查我们的数据是否在系统的缓存中,如果在缓存中,那么操作系统不会把这个请求发送给设备驱动程序,而会直接将数据从高速缓存中复制给我们的程序,直接完成IO请求如果IO操作是以同步方式执行的,那么ReadFile和WriteFile将会返回非0值,如果是以异步的,或者发生了错误,那么将会返回FALSE1.O 阅读全文
摘要:
什么是dll:dll只是一组源代码的模块,每个模块包含一些可供应用程序或者其他dll调用的函数,在应用程序调用一个dll里面的函数的时候,操作系统会将dll的文件映像映射到进程的地址空间中,这样进程中所有的线程就可以调用dll中的函数了dll加载完成后,这个时候dll对于进程中的线程来说只是一些被放在地址进程空间附加的代码和数据,操作系统为了节省内存空间,同一个dll在内存中只有一个,也就是说如果你的的两个应用程序都需要加载user32.dll,那么操作系统也只会加载一次user32.dll到内存中因为代码段在内存中的权限都是为只读的,所以当多个应用程序加载同一个dll的时候,不用担心应用程序 阅读全文
摘要:
http://code.google.com/p/vimide/基础的ide是从这里下的,说实话用了那么多年,还是觉得vim不怎么好用,但是确实很喜欢他那个快捷键,linux确实没什么好用的ide,所以一直在用,一直在配环境,每次都不满意,这次在以这个为基础上面要好好配置一次因为基础的这个taglist和NerdTree是横放的,很不舒服,占用太大的屏幕了,所以重新用了winmanager这个插件,在vimrc里面加入这几句let g:AutoOpenWinManager=1let g:persistentBehaviour=0let g:defaultExplorer=0这上面三句是网上的, 阅读全文
摘要:
第二题:-module(for).-export([for/3,empty_proc/0,post_msg/1]).for(N,N,F)->[F()];for(I,N,F)->[F() | for(I+1,N,F)].empty_fun()-> receive _Any-> io:format("~w is exit",[self()]) end.post_msg([]) -> void;post_msg([Head | Tail])-> Head ! "Other", post_msg(Tail).在shell里面输 阅读全文