六、构建项目编译CMake文件_ev
创建mymuduo目录,作为项目工程名
在mymuduo下创建CMakeLists.txt
cmake_minimum_required(VERSION 2.5)
project(mymuduo)
# cmake => makefile make
# mymuduo最终编译成so动态库,设置动态库的路径,放在根目录的lib文件夹下面
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 设置调试信息 以及 启动C++11语言标准
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -fPIC")
# 定义参与编译的源代码文件
aux_source_directory(. SRC_LIST)
# 编译生成动态库mymuduo
add_library(mymuduo SHARED ${SRC_LIST})
七、noncopyable代码
TcpServer、很多类都是继承noncopyable,是私有继承
这样继承后派生类都被限制不能进行拷贝构造和赋值,这样是为了避免在所有的类中都要有禁止拷贝构造和赋值的代码。
八、Logger日志系统
1、几种日志信息等级
INFO, // 普通信息
ERROR, // 错误信息
FATAL, // core信息 致命性信息
DEBUG, // 调试信息 到时候不让这里显示
2、
【技巧】自己从后面加下划线,比如logLevel_,是为了和系统的变量不产生冲突
九、Timestamp
格式化系统时间
1、无参构造函数(默认值设为0)
2、有参构造函数(加入explicit禁止默认对象转换)
3、now成员函数(返回现在时间)
4、toString成员函数(将现在时间格式转换为string类型的)
最终效果Timestamp::now().toString()将会返回当前时间
10、InetAddress
封装socket地址类型
成员私有变量 sockaddr_in addr_
1、构造函数 用ip和端口初始化(默认端口为0 ip为本地127.0.0.1)
2、构造函数 用sockaddr_in初始化
3、toIp成员函数方法 (将sockaddr的ip转换为网络字节序的ip)
4、toIpPort()成员函数方法(将sockaddr类型转换为ip:port字符串类型)
5、toPort()成员函数方法(将sockaddr类型转换返回port的字符串类型)
#include "InetAddress.h"
#include <strings.h>
#include <stdio.h>
#include <string.h>
InetAddress::InetAddress(uint16_t port, std::string ip)
{
bzero(&addr_, sizeof addr_);
addr_.sin_family = AF_INET;
addr_.sin_port = htons(port);
addr_.sin_addr.s_addr = inet_addr(ip.c_str());
}
std::string InetAddress::toIp() const
{
// addr_
char buf[64] = {0};
::inet_ntop(AF_INET, &addr_.sin_addr, buf, sizeof buf);
return buf;
}
std::string InetAddress::toIpPort() const
{
// ip:port
char buf[64] = {0};
::inet_ntop(AF_INET, &addr_.sin_addr, buf, sizeof buf);
size_t end = strlen(buf);
uint16_t port = ntohs(addr_.sin_port);
sprintf(buf+end, ":%u", port);
return buf;
}
uint16_t InetAddress::toPort() const
{
return ntohs(addr_.sin_port);
}
#include <iostream>
int main()
{
InetAddress addr(8080);
std::cout << addr.toIpPort() << std::endl;
return 0;
}