摘要:
1.strlen函数总是假定其参数字符串以NULL结束,若字符串不是以NULL结束,计算的结果将不可预料。2.多个表达式可以由逗号分开,每个表达式的值分别计算,但整个表达式的值是最后一个表达式的值。3.二维数组转化为一维数组后,二维数组元素a[x][y] = b[x * 列数 + y],其中b是转化... 阅读全文
摘要:
在前面,我们封装好了线程池与Socket的相关组件,接下来我们实现几个将简单的实例。首先,我们可以将用户实现的回调函数封装到class中直接绑定,这样,简洁的main函数中,我们只需传递相应的IP与port,然后启动服务器即可。然后,我们可以实现一个群聊的小程序,我们需要将连接的客户端保存好,然后遍... 阅读全文
摘要:
我们要封装Socket,首先我们需要了解Socket需要哪些要素: 1) 首先,一个套接字创建后,需要绑定一块网卡的IP,以及连接的对口号,所以我们先封装InetAddr。在class中,仅有的一个私有成员就是struct sockaddr_in类型的一个对象,我们需要将该对象的几种赋值与创建封装... 阅读全文
摘要:
在TCP连接中,我们会遇到端口复用、粘包问题等。当server端主动关闭socket,会产生一个TIME_WAIT的状态,所以我们需要加上端口复用的选项,来解决该问题。由于TCP是个流协议,所以无法提供报文服务,这就需要去处理粘包问题,解决方法有: 1) 采用固定长度发送数据,这样做的话局限性比较... 阅读全文
摘要:
线程池的封装,基础思想与生产者消费者的封装一样,只不过我们是将线程池封装为自动获取任务、执行任务,让用户调用相应的接口来添加任务。在线程池的封装中,我们同样需要用到的是MutexLock、Condition、Thread这些基本的封装。基础封装如下:MutexLock: 1 #ifndef MUTE... 阅读全文
摘要:
在Linux中,有一种简单的定时器——timerfd,它通过查看fd是否可读来判断定时器时候到时。timerfd中常用的函数有timerfd_create、timerfd_settime、timerfd_gettime,这些函数都相对简单,我们可以到man手册来查看用法。值得注意的是:create中... 阅读全文
摘要:
1.异常处理: a)在try块中,一旦发生错误,立即抛出异常,然后转入catch块中(try块中剩余的代码不会被执行)。 b)如果throw异常不去捕获,会造成程序core dump(异常处理没有对应的代码块,同样会引起core dump)。 c)对于不同类型的异常,可以采用不同的catch块... 阅读全文
摘要:
单例模式的描述是: 确保一个类只有一个实例,并提供对该实例的全局访问。从这段话,我们可以知道,单例模式的最重要特点就是:一个类最多只有一个对象。对于一个普通类,我么可以生成任意对象,我们为了避免生成太多的类,需要将类的构造函数设为私有。这样的话,我们为了获取实例,只能借助于类的内部函数,而且必须是s... 阅读全文
摘要:
有这样一个类,我们以此类为基础: 1 class Foo 2 { 3 public: 4 5 //void (Foo::*)(int) 6 void foo(int a) 7 { 8 cout *pFunc2)(12);相对于static成员函数,我们可以像... 阅读全文
摘要:
function是一种类模板,重载了operator()函数调用操作符,所以每一个function类的对象都是一个函数对象。我们可以这样使用function模板:#include #include #include #include using namespace std;void foo(cons... 阅读全文