杂项
C++杂项
Visual studio
- system("pause"); 防止输出框一闪而过
- F5 执行;F11 逐语句debug; F10逐过程
- F9 新建断点
void*指针
- 任何类型指针都可以转为void*,它无条件接受各种类型
- 一般用在通用型接口的参数类型
- 在具体使用时,需要转化为具体的指针类型
extern "C" : 告诉C++编译器这段代码使用C标准编译,使得在C和C++混编的情况下两者得以兼容
struct和type struct类型:参考
fprintf :发送格式化输出到文件流 参考
cd - 回到上一目录
UML类关系图 参考
C++ try-catch捕获异常 参考
makefile 教程
- src源码 inc头文件 bin执行码与so文件 lib静态/动态库
- etc配置脚本 tools/op控制与监控脚本 log日志目录
linux下.a 和.o文件:
- .a文件:静态库,对函数库的链接是在编译期间完成的,程序运行时便和函数库无关,因为已经拷贝了
- .o文件:动态库,库函数的链接载入推迟到程序的运行时期;可以节省资源,无需每次都载入所有的函数;而且可以实现在进程之间的资源共享
ln命令:为某一个文件在另一个文职建立一个同步的链接,类似于win下的快捷方式 参考
- 软连接
- 硬链接
C++中的虚函数和纯虚函数 参考
linux signal函数 参考
http协议:建立在tcp/ip之上的协议,通过TCP连接传输数据 参考
Socket 参考
- timeval 结构体 参考 协议实现过程中经常会有同步时间计算获得时间延迟,一般配合gettimeofday使用
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
#include <iostream>
#include "sys/time.h"
int main()
{
struct timeval tv_b, tv_d;
unsigned long long timeconsumed = 0;
gettimeofday(&tv_b, NULL);
for(int i=0;i<100000;i++){}
gettimeofday(&tv_d, NULL);
timeconsumed = tv_d.tv_sec - tv_b.tv_sec + (tv_d.tv_usec - tv_b.tv_usec)/1000000;
std::cout << tv_d.tv_usec - tv_b.tv_usec << std::endl;
return 0;
}
-
string assign方法:将原字符串清空,然后赋予新值进行替换
-
struct in_addr:表示一个32位的ipv4地址 参考
- 网络字节序:32位的unsigned int,每8位表示IP地址中一个数值;采用大端序(数据的高位在低地址)
struct in_addr {
in_addr_t s_addr;
};
- string c_str():参考 将一个string转换成const* char(C语言风格的字符串)
#include <iostream>
#include <string.h>
int main()
{
std::string s = "1234";
char *p;
// p = s.c_str() //错误
p = new char[s.size() + 1];
strcpy(p, s.c_str());
std::cout << p << std::endl;
delete[] p;
return 0;
}
输出
1234
- inet_ntoa和inet_aton: 参考 将网络字节序的IP地址和字符串表示的点分十进制IP地址相互转换
#include <iostream>
#include <stdlib.h>
#include <arpa/inet.h>
int main()
{
char IP[] = "127.0.0.1";
in_addr address;
int number = inet_aton(IP, &address);
std::cout << number << std::endl;
std::cout << address.s_addr << std::endl;
std::cout << inet_ntoa(address) << std::endl;
return 0;
}
输出
1
16777343
127.0.0.1
time(0) 返回系统时间(从1970.1.1开始算起,since epoch),单位:秒 参考
- inet_addr:将点分十进制的字符串转换为网络字节序
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <arpa/inet.h>
using namespace std;
int main(){
int val;
char str[] = {"127.1.0.1"};
val = inet_addr(str);
printf("val: %d\n", val);
return 0;
}
-
netstat -an | grep tcp 查看当前网络的TCP连接
-
netstat -lnp 查看网络连接(推荐)
-
tcpdump tcp -i any port 32323 -A -s 512 -nn 抓包分析
-
strcmp : 字符串比较
-
strstr:查找字符串第一次出现的位置;strcasestr:查找字符串第一次出现的位置,无视大小写
-
memset:字符串复制函数
-
strtol:将字符串根据给定的进制转换成long int型
-
memmove(str1, str2, n):从str2中复制n个字符到str1
-
sprintf(str1, st2):发送格式化输出str2到str1
-
fread() :读取文件流
-
rm core* 删除所有带core的文件
-
core文件:参考 程序执行期间发生了segment fault段错误,操作系统会把此程序当前的内存信息dump到磁盘上,即生成core文件,可以使用gdb对core文件进行分析出程序crash的地方。core文件表明程序出现了严重的错误,需要详细的debug
-
Fiddler,参考 一个http的调试代理,以代理服务器的方式监听系统的http网络数据流动。
-
.a和.so 静态库与动态库:参考
-
makefile 中隐式规则 参考 CXX=g++
-
assert : 断言,用于调试程序和检查错误;一般用于检验参数的合法性,但是频繁的调用assert会极大影响程序的性能,增加额外的开销
-
strtok:与要搜索的字符串的顺序无关
#include <stdlib.h> using namespace std; int main(){ char method[100]; char filename[100]; char buffer[] = "GET /index.html HTTP/1.1\r\n"; strcpy(method, strtok(buffer, " /")); strcpy(filename, strtok(NULL, "/ ")); //strcpy(filename, strtok(NULL, " /")); printf("%s, %s\n", method, filename); return 0; }
-
主机字节序与网络字节序:参考
htonl, htons, ntohl, ntohs h表示主机,n表示网络,l表示整形long,s表示短整型short
#include <stdlib.h> #include <arpa/inet.h> using namespace std; int main(){ unsigned long a = 0x12345678; unsigned char *p = (unsigned char*)(&a); printf("主机字节序:%0x, %0x, %0x, %0x\n", p[0], p[1], p[2], p[3]); printf("主机字节序数字大小: %d\n", a); unsigned long b = htonl(a); printf("网络字节序数字大小: %d\n", b); p = (unsigned char*)(&b); printf("网络字节序:%0x, %0x, %0x, %0x\n", p[0], p[1], p[2], p[3]); return 0; }
-
IP地址与网络字节序 参考
#include <netinet/in.h> using namespace std; int main(){ struct in_addr ipaddr; unsigned int addr = inet_addr("127.0.0.1"); printf("addr = %d\n", ntohl(addr)); ipaddr.s_addr = addr; //addr为网络字节序 printf("%s\n", inet_ntoa(ipaddr)); return 0; }
-
栈内存和堆内存:参考 new出来的对象存储在堆内存中,直接定义的数组存储在栈内存中;栈内存很小,32M,但是速度快;当需要大的buffer时,要new出来,而不是直接char *;不然会报segment fault段错误
-
fread的r和rb模式:对于普通文本使用r,图片使用rb;使用r会遗漏某些控制的字符
-
.gitignore忽略文件:参考
-
coderunner使用C++11标准 参考